Android开发——使用ActivityLifecycleCallbacks监控App是否处于后台

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+即可。

发布了142 篇原创文章 · 获赞 1456 · 访问量 168万+

猜你喜欢

转载自blog.csdn.net/SEU_Calvin/article/details/75041045
今日推荐