博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android开发——使用ActivityLifecycleCallbacks监控App是否处于后台
阅读量:4047 次
发布时间:2019-05-24

本文共 2819 字,大约阅读时间需要 9 分钟。

0.前言

项目中经常会遇到判断App是否工作在后台的情景,除了判断runningTasks这种方法,其实有一种更加优雅的方法,就是使用ActivityLifecycleCallbacks

 

1ActivityLifecycleCallbacks

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);}

看方法名字就很清晰的知道,它定义了App内所有的Activity从创建到销毁的回调方法。我们使用的时候实现这个接口,然后在我们自定义的Application调用初始化。所有 Activity 的生命周期都会回调上面对应的方法。

2.判断App是否在前台后台

下面这个工具类原理是通过统计所有Activity回调onStartonStop的次数关系,调用最后面的两个static方法即可判断App是处于前台还是后台。大家有兴趣可以结合代码逻辑和Activity的生命周期进行各种场景下的验证。

/** * Created by calvin on 2017/7/12. */import android.app.Activity;import android.app.Application;import android.os.Bundle;public class LifeHandler implements Application.ActivityLifecycleCallbacks {    private static boolean isAppInForeground;    private static int resumed;    private static int paused;    private static int started;    private static int stopped;    public LifeHandler() {        resumed = 0;        paused = 0;        started = 0;        stopped = 0;    }    @Override    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {    }    @Override    public void onActivityStarted(Activity activity) {        if (isAppShowFromBackground()) {            isAppInForeground = true;        }        ++started;    }    @Override    public void onActivityResumed(Activity activity) {        ++resumed;    }    @Override    public void onActivityPaused(Activity activity) {        ++paused;    }    @Override    public void onActivityStopped(Activity activity) {        ++stopped;        if (isAppInBackground()) {            isAppInForeground = false;        }    }    @Override    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {    }    @Override    public void onActivityDestroyed(Activity activity) {    }    private static boolean isAppShowFromBackground() {        return started == stopped;    }    //外部调用    public static boolean isAppInForeground() {        return isAppInForeground;    }    public static boolean isAppInBackground() {        return started == stopped;    }}

然后我们只需要在Application里进行初始化并设置接口即可。

public class App extends Application {    @Override    public void onCreate() {        super.onCreate();        registerActivityLifecycleCallbacks(new LifeHandler());    }}

方法参数中的Activity可以让我们知道到底是哪个Activity在进行生命周期的回调,可以用来做很多事情。比如大名鼎鼎的内存泄漏检测工具LeakCanary就是使用这个接口来监测所有调用了onDestory方法,并将其放入监测队列,后台监测若继续存在这个实例就调用GC,若继续存在就查看内存快照并计算出到GC Roots的最短引用路径并打印Log让人们看到内存泄漏的发生。到底怎么用就看你自己的需求啦。只需要注意这个接口的使用需要API14+即可。

转载地址:http://nuzci.baihongyu.com/

你可能感兴趣的文章
[leetcode BY python]1两数之和
查看>>
微信小程序开发全线记录
查看>>
PTA:一元多项式的加乘运算
查看>>
CCF 分蛋糕
查看>>
解决python2.7中UnicodeEncodeError
查看>>
小谈python 输出
查看>>
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
查看>>
python:如何将excel文件转化成CSV格式
查看>>
机器学习实战之决策树(一)
查看>>
机器学习实战之决策树二
查看>>
[LeetCode By Python]7 Reverse Integer
查看>>
[leetCode By Python] 14. Longest Common Prefix
查看>>
[LeetCode By Python]121. Best Time to Buy and Sell Stock
查看>>
[LeetCode By Python]122. Best Time to Buy and Sell Stock II
查看>>
[LeetCode By Python]125. Valid Palindrome
查看>>
[LeetCode By Python]136. Single Number
查看>>
Android/Linux 内存监视
查看>>
用find命令查找最近修改过的文件
查看>>
Android2.1消息应用(Messaging)源码学习笔记
查看>>
android raw读取超过1M文件的方法
查看>>