首先,我用一个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这些方法()事件的所有活动或者,优选地,在碱的活动从所有的混凝土活动继承:
@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被设置为true。
从How to detect... 由于复制到d60402
的可能的复制【如何当一个Android应用程序转到后台检测和回来的前景(http://stackoverflow.com/questions/4414171/how -to-检测 - 当 - 的 - Android的应用程序,去到的背景和先得背到了-FO) – ant 2017-04-10 09:08:22