私はあなたのコードの残りを見ることができないので、私はいくつかのことを仮定するつもりです。
仮定#1
アクティビティを開いていて、カウントダウンが開始され、10秒後に期限切れになると、電話が振動します(アクティビティは開いたままです)。ホーム画面に移動すると、バイブレーションが止まります。
仮定#2
アクティビティを開いて、カウントダウンを開始します。10秒が経過する前に、ホーム画面に移動します。あなたの活動は見えませんが、電話はすぐに振動し始めます。
これがあなたが見ているものである場合、それは正しい振る舞いです。問題は、2番目のケースでは、ホーム画面に移動したときに、実際に振動が始まる前に、onPause()からshake.cancel()が呼び出されることです。shake.cancel()は、すでに振動している場合にのみキャンセルできます。
それがあなたが修正しようとしているものである場合(私はあなたのコードの残りの部分を見ることができないので私は推測することができるだけです)、あなたはこれを試すことができます:
private boolean mAllowShake = false;
@Override
public void onResume() {
super.onResume();
mAllowShake = true;
}
@Override
pulic void onPause() {
super.onPause();
mAllowShake = false;
shake.cancel();
}
// wherever you are calling the shake.vibrate()
if (mAllowShake)
shake.vibrate();
このように、アクティビティが表示されずにタイマーがオフになった場合、mAllowShakeはfalseであるため、実際には振動しません。
それが修正しようとしているものではない場合は、より多くのコードと正確なユースケースの説明で質問を更新してください。それが役に立てば幸い!