我在我的应用程序中添加了声音设置作为prefences,我设法使用
禁用和启用声音 Settings.System.putInt(getContentResolver(), Settings.System.SOUND_EFFECTS_ENABLED, 0);
和
Settings.System.putInt(getContentResolver(), Settings.System.SOUND_EFFECTS_ENABLED, 1);
但是当按下主页按钮暂停应用程序时,我需要将声音保留为默认值。我找不到任何方法来重新认识这种做法。
我知道尝试在任何活动生命周期方法中执行它都不会起作用。 有没有办法识别,我的应用程序是在后台运行还是在运行? (我正在考虑整个应用程序的视角,以便我可以在用户最小化时启用声音,并在他进入我的应用程序时重新禁用)
提前致谢
答案 0 :(得分:2)
首先,我使用了一个android.app.Application实例(让我们称之为MyApplication),它有一个Timer,一个TimerTask,一个常量来表示从一个转换到一个的最大毫秒数对另一个人的活动可以合理地采取(我的值为2s),以及一个布尔值来表明该应用程序是否是"在后台":
public class MyApplication extends Application {
private Timer mActivityTransitionTimer;
private TimerTask mActivityTransitionTimerTask;
public boolean wasInBackground;
private final long MAX_ACTIVITY_TRANSITION_TIME_MS = 2000;
...
该应用程序还提供了两种启动和停止计时器/任务的方法:
public void startActivityTransitionTimer() {
this.mActivityTransitionTimer = new Timer();
this.mActivityTransitionTimerTask = new TimerTask() {
public void run() {
MyApplication.this.wasInBackground = true;
}
};
this.mActivityTransitionTimer.schedule(mActivityTransitionTimerTask,
MAX_ACTIVITY_TRANSITION_TIME_MS);
}
public void stopActivityTransitionTimer() {
if (this.mActivityTransitionTimerTask != null) {
this.mActivityTransitionTimerTask.cancel();
}
if (this.mActivityTransitionTimer != null) {
this.mActivityTransitionTimer.cancel();
}
this.wasInBackground = false;
}
此解决方案的最后一部分是从所有活动的onResume()和onPause()事件中添加对这些方法中的每一个的调用,或者最好是在所有具体活动继承的基本活动中添加: / p>
@Override
public void onResume()
{
super.onResume();
MyApplication myApp = (MyApplication)this.getApplication();
if (myApp.wasInBackground)
{
//Do specific came-here-from-background code
}
myApp.stopActivityTransitionTimer();
}
@Override
public void onPause()
{
super.onPause();
((MyApplication)this.getApplication()).startActivityTransitionTimer();
}
因此,当用户只是在应用程序的活动之间导航时,离开活动的onPause()会启动计时器,但几乎立即输入的新活动会取消计时器,然后才能达到最大转换时间。所以wasInBackground会是假的。
另一方面,当一个Activity从Launcher到达前台时,设备唤醒,结束通话等,很可能是在此事件之前执行的计时器任务,因此wasInBackground被设置为true。 / p>
从How to detect...复制 感谢d60402