ここでの問題は、アプリの実行時に、アプリが常にアクティビティスタックの最上位にあるとは限らないことです。ユーザーが別のアプリに切り替えた場合、または何らかのアラームや電話がフォーカスを引き継いだ場合はどうなりますか?
これがあなたがやろうとしていることを達成するために私が行くいくつかの方法です(以下のコメントから拡張されています):
オプション1:
ミュートアクションがアプリのパフォーマンスに影響を与えない場合(私自身の経験から、影響はないと思います)、onResume ()とonPause( )をオーバーロードする単一の抽象基本クラスを使用して、質問で提案したソリューションを単純化できます。ユーザーが作成済みのアクティビティに戻ったときにイベントを確実にキャプチャするには、次のようにします。
public abstract class TeachingAppActivity extends Activity {
public void onResume() {
super.onResume();
// Perform mute action here...
}
public void onPause() {
super.onPause();
// Perform unmute action here...
}
}
public class MyActivity1 extends TeachingAppActivity {
}
public class MyActivity2 extends TeachingAppActivity {
}
これによりコードが簡素化されますが、アクションはアクティビティ内に含まれます。別のアプリがフォーカスを取得すると、呼び出し音が復元されます。ユーザーがMyActivity2に戻ると、呼び出し音は再びミュートされます。
オプション2:
ミュートアクションが実際にアプリのパフォーマンスに影響を与える場合、または単にすべてのアクティビティのonResume()とonPause()で実行したくない場合は、代わりにワーカースレッドとステータスバー通知を使用できます。
- 各アクティビティでonResume() ; AsyncTask(またはRunnableタスク)を開始すると、Activityをサブクラス化して、このコードを他のアクティビティと共有できます。
- このワーカースレッドは、最初にボリュームをチェックし、次にミュートします。ボリュームが変更されると、ボリュームがミュートされたことをユーザーに通知する通知アイコンが表示されます。
- その後、UIのパフォーマンスに影響を与えることなく、このチェックとアクションを実行して、ワーカースレッドを終了できます。
- アプリの実行中は音量がミュートされたままになります。ユーザーが別のアプリにジャンプした場合(または着信/メッセージにフォーカスが移った場合)、通知アイコンがまだ表示されているため、音量がミュートされていることに気づきます。
- ユーザーが通知アイコンを押すと、ブロードキャストインテントによって音量が復元されます。これは、アプリ内のボタンまたはアクションによってトリガーされる場合もあります。
ユーザーがホームボタンを押すか、アプリで[戻る]ボタンを繰り返し押すと、音量は復元されません。これは意図的なものです。アプリを「終了」していないため、アクティビティスタックの一番下に移動しただけです。ルールは次のとおりです。通知アイコンが表示されている限り、音量はアプリによってミュートされています。
ここでの追加の利点は、別のアプリが音量を変更した場合、アクティビティのいずれかが再びフォーカスを受け取ったときにアプリが常にチェックすることです。