这里的问题是您的应用程序在运行时可能并不总是位于活动堆栈的顶部。如果用户切换到另一个应用程序,或者某个警报或电话接管了焦点怎么办?
这里有一些方法可以实现你想要做的(从下面的评论中扩展):
选项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()中执行它,则可以改用工作线程和状态栏通知:
- 在每个 Activity onResume() ; 启动一个 AsyncTask(或 Runnable 任务),您可以将 Activity 子类化以与您的其他活动共享此代码。
- 该工作线程首先检查音量,然后静音。如果音量发生变化,它会显示一个通知图标,通知用户音量已被静音。
- 然后,工作线程可以终止,执行此检查和操作而不影响 UI 性能。
- 在应用程序运行期间,音量将保持静音,如果用户跳转到另一个应用程序(或来电/消息获得焦点),他/她仍然知道音量已静音,因为通知图标仍然存在。
- 如果用户按下通知图标,广播意图会恢复音量。这也可能由您的应用程序中的按钮或操作触发。
如果用户在您的应用程序中按下 Home 键或反复按下 Back 键,音量将不会恢复。这是故意的,因为他们没有“退出”你的应用程序,他们只是移动到了活动堆栈的底部。规则是:只要通知图标可见,您的应用程序就已将音量静音。
这里的额外好处是,如果另一个应用程序改变了音量,您的应用程序将始终检查您的任何活动何时再次获得焦点。