看了 stay 的视频了解到判断 app 是否在后台运行除了使人蛋疼的判断当前 runningProcess 或者 runningTasks 方法, 还有一种更为简便的方法, 那就是 ActivityLifecycleCallbacks.html
###官方文档 官方文档居然连介绍都没有, 官方文档android
public interface ActivityLifecycleCallbacks {
void onActivityCreated(Activity activity, Bundle savedInstanceState);
void onActivityStarted(Activity activity);
void onActivityResumed(Activity activity);
void onActivityPaused(Activity activity);
void onActivityStopped(Activity activity);
void onActivitySaveInstanceState(Activity activity, Bundle outState);
void onActivityDestroyed(Activity activity);
}
复制代码
翻看源码, 它是一个接口, 定义了 Activity 从建立到销毁的回调方法.app
咱们使用的时候实现这个接口, 而后在咱们自定义的 Application 调用初始化. 全部 Activity 的生命周期都会回调上面的方法.
初始化的时候须要注册它 application.registerActivityLifecycleCallbacks(this);
ide
那咱们判断 app 在不在前台的依据是什么呢?ui
首先来看一张 Activity 的生命周期图:
this
它每一个方法的说明: spa
官方文档 Activity 连接code
能够看到, onStart() 是即将对用户可见时调用, 也就是即将在前台的时候, 对应的就是 onStop() , 对用户再也不可见时调用. 因此在这 2 个方法来对 app 是否在前台作出判断.component
咱们定义一个计数器 int activeCount
来记录 Activity 活动的个数, Activity 调用 onStart 就 +1, onStop 就 -1. 在 onResumed 的时候就是在前台的时候. 同时也能够定义一个 long time
, 定义在 app 在前台呆了多长时间.视频
public class AppStatusTracker implements Application.ActivityLifecycleCallbacks {
private static final long MAX_INTERVAL = 5 * 60 * 1000;
private static AppStatusTracker tracker;
private Application application;
private boolean isForground;
private int activeCount;
private long timestamp;
private AppStatusTracker(Application application) {
this.application = application;
application.registerActivityLifecycleCallbacks(this);
}
public static void init(Application application) {
tracker = new AppStatusTracker(application);
}
public static AppStatusTracker getInstance() {
return tracker;
}
public boolean isForground() {
return isForground;
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
if (activeCount == 0){
timestamp = System.currentTimeMillis();
}
activeCount++;
}
@Override
public void onActivityResumed(Activity activity) {
isForground = true;
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
activeCount--;
if (activeCount == 0) {
isForground = false;
timestamp = System.currentTimeMillis() - timestamp;
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
}
复制代码
而后在本身的 application 里面初始化就能够了.
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
AppStatusTracker.init(this
);
}
}
复制代码
逻辑挺简单的呵呵. 不过这个功能只在 4.0 之上可用, 不过如今应该基本都是 4.0 以上的手机了吧. 除了这个简单的功能, 还能够加入一个广播来判断屏幕熄灭后要作的逻辑. 后面等我摸索熟了再来实现.