Android 全局管理 Activity 栈

前言

最近在写 Notification 的 Demo,梳理 Notification 的各种样式以及点击 Notification 启动 Activity 的各种方式。
所有的 app 点击通知栏启动 Activity 的方式不外乎以下三种:

  • 如果要启动的 app 已经被杀掉,则启动主界面,否则启动栈顶的 Activity;
  • 启动特定的 Activity,不管当前 app 有没有被杀掉,点击后退键后返回到当前 app 的主界面,例如微信、QQ等等;
  • 启动特定的 Activity,启动前判断,如果当前程序没有被杀掉且除了当前被启动的 Activity 外至少有一个 Activity 没有被 finish,点击后退键则返回到之前栈顶的 Activity;如果当前程序被杀掉或之前任务栈没有 Activity,点击后退键则返回到当前 app 的主界面,例如网易云音乐。

上面的第三种启动方式需要判断 app 中是否有暂时没有被 finish 的 Activity。
很遗憾,Google 官方并没有给我们提供类似的方法去做判断,但这不妨碍我们自己去深究这个问题,这个问题就要牵涉到 app 的 Activity 管理。

之前我们是如何实现的?

我刚开始做项目的时候,管理 Activity 的方式是在 BaseActivity 中维护 Activity 的 List,在 OnCreate() 和 onDestroy() 调用 add 和 remove ,但是如果 Activity 没有继承封装的 BaseActivity,那每个 Activity 就都要在 onCreate() 中写维护 BaseActivity 中的 List 的代码,同时当 Activity 销毁时,也要从 List 中将此 Activity 移除等等,这样搞下来,一旦 Activity 特别多的时候,说不定哪次就忘了,出了问题了也不好追踪。

那应该如何解决?

image

喜大普奔。
Google 亲大爷知道我们想要什么,想什么来什么,一次一次的给我们这些 Android 搬砖工们带来了一个又一个的福音。
这不,从 API 14 开始,Application 中多了一个方法:registerActivityLifecycleCallbacks


顾名思义,注册 Activity 生命周期回调,可以全局监听 Activity 的生命周期,因此我们可以从 Application 中全局监听所有 Activity 并对其进行管理。


image

初始化 List

private List list = Collections.synchronizedList(new LinkedList());

添加 Activity

public void addActivity(Activity activity) {
        if (activity == null)
            return;
        list.add(activity);
    }

删除 Activity

public void removeActivity(Activity activity) {
        if (activity == null)
            return;
        list.remove(activity);
    }

注册回调

在回调的 onActivityCreated() 方法中添加 Activity,在 onActivityDestroyed() 方法中删除 Activity

private void registerActivityListener() {
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                addActivity(activity);
            }

            @Override
            public void onActivityStarted(Activity activity) {

            }

            @Override
            public void onActivityResumed(Activity 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) {
                removeActivity(activity);
            }
        });
    }

判断

public boolean isAllActivityFinished() {
        return list == null || list.isEmpty();
    }

最后别忘了在 AndroidManifest.xml 中设置 Application 的 name。
你也可以获取栈顶 Acitivty以及 finish 某个特定的 Activity 等等。
详见:NotificationDemo

Smile Wei wechat
请扫码关注我的微信公众号