初识 ActivityLifecycleCallbacks

看了 stay 的视频了解到判断 app 是否在后台运行除了令人蛋疼的判断当前 runningProcess 或者 runningTasks 方法, 还有一种更为简便的方法, 那就是 ActivityLifecycleCallbacks.

###官方文档 官方文档竟然连介绍都没有, 官方文档

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 从创建到销毁的回调方法.

我们使用的时候实现这个接口, 然后在我们自定义的 Application 调用初始化. 所有 Activity 的生命周期都会回调上面的方法.
初始化的时候需要注册它 application.registerActivityLifecycleCallbacks(this);

那我们判断 app 在不在前台的依据是什么呢?

首先来看一张 Activity 的生命周期图:

它每个方法的说明:

官方文档 Activity 链接

可以看到, onStart() 是即将对用户可见时调用, 也就是即将在前台的时候, 对应的就是 onStop() , 对用户不再可见时调用. 所以在这 2 个方法来对 app 是否在前台做出判断.

我们定义一个计数器 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 以上的手机了吧. 除了这个简单的功能, 还可以加入一个广播来判断屏幕熄灭后要做的逻辑. 后面等我摸索熟了再来实现.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值