初识 ActivityLifecycleCallbacks

看了 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

activityLife

它每一个方法的说明: spa

activityVoid

官方文档 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 以上的手机了吧. 除了这个简单的功能, 还能够加入一个广播来判断屏幕熄灭后要作的逻辑. 后面等我摸索熟了再来实现.

相关文章
相关标签/搜索