神奇的ActivityLifecycleCallbacks

Android自 API 14开始引入了一个方法,即Application的 registerActivityLifecycleCallbacks 方法,用来监听所有Activity的生命周期回调。通过这个方法,我们可以轻松获取到当前运行的 Activity 的实例,还可以判断应用是在前台运行还是后台运行。

我们先来看下面的一个简单代码块:

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

            }

            @Override
            public void onActivityStarted(Activity activity) {

            }

            @Override
            public void onActivityResumed(Activity activity) {
                ActivityManager.getInstance().setCurrentActivity(activity);
            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {

            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
    }
}

可能有人会有个疑问, ActivityManager 是个什么鬼东西来的,ok,我们现在看一下这个类的实现:

public class ActivityManager {

    private static ActivityManager mInstance = new ActivityManager();
    private WeakReference<Activity> mCurrentActivityWeakRef;

    private ActivityManager() {
    }

    public static ActivityManager getInstance() {
        return mInstance;
    }

    public Activity getCurrentActivity() {
        if (mCurrentActivityWeakRef != null) {
           return mCurrentActivityWeakRef.get();
        }
        return null;
    }

    public void setCurrentActivity(Activity activity) {
        mCurrentActivityWeakRef = new WeakReference<>(activity);
    }
}

这里使用饿汉式单例模式来弱引用保存了 Activity 的实例。这个实例保存下来可以说有非常多的用处,特别是在处理 Serivice 里面来触发对应 Activity 的跳转之类的需求。这里感谢一下技术小黑屋 ,提供了这个个非常有用的方法。

正如上面说, registerActivityLifecycleCallbacks 方法还可以帮助我们判断应用是处于前台运行还是后台运行。这个判断方法也很简单,直接看下面的代码:

public class MyApplication extends Application {
    private int activityCounter = 0;

    @Override
    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
            }

            @Override
            public void onActivityStarted(Activity activity) {
                activityCounter++;
            }

            @Override
            public void onActivityResumed(Activity activity) {
            }

            @Override
            public void onActivityPaused(Activity activity) {
            }

            @Override
            public void onActivityStopped(Activity activity) {
                activityCounter--;
            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
    }

    public boolean getAppFrontRunning() {
        return activityCounter>0;
    }
}

想必大家都了解两个 Activity 之间的跳转的生命周期:

A.onPause() -> B.onCreate() -> B.onStart() -> B.onResume() -> A.onStop()

因为我们可以通过 Activity 的生命周期的追踪回调,对 activityCounter 进行简单的加减处理,从而只需要判断 activityCounter 是否大于0即可知道当前应用是否处于前台运行。

结语

综上所述, registerActivityLifecycleCallbacks 一个很好用的方法,但是如果你的应用需要兼容到 API 14版本以下,就不能采取这种方式

猜你喜欢

转载自blog.csdn.net/f409031mn/article/details/79115906
今日推荐