Android 四种启动模式,代码实验

大家都知道,相关的文章也很多:


standard : 
标准模式,每次启动Activity都会创建一个新的Activity实例,并且将其压入任务栈栈顶,
而不管这个Activity是否已经存在。Activity的启动三回调(onCreate()->onStart()->onResume())
都会执行。
singleTop : 
栈顶复用模式.这种模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,
所以它的启动三回调就不会执行,同时Activity的onNewIntent()方法会被回调.如果Activity已经
存在但是不在栈顶,那么作用于standard模式一样.
singleTask: 
栈内复用模式.创建这样的Activity的时候,系统会先确认它所需任务栈已经创建,否则先创建任务栈.
然后放入Activity,如果栈中已经有一个Activity实例,那么这个Activity就会被调到栈顶,
onNewIntent(),并且singleTask会清理在当前Activity上面的所有Activity.(clear top)
singleInstance : 
加强版的singleTask模式,这种模式的Activity只能单独位于一个任务栈内,由于栈内复用的特性,
后续请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁了


不知是有些文章说的有误,还是我的能力有限,发现:singleTask并不会新创建独立的task,不知道上面的内容中是否说的这个意思。一下有我的代码验证:

写一个类,获取栈的相关信息:

public class TaskTest {
    public static void showTask(Activity activity) {
        ActivityManager activityManager = (ActivityManager) activity.getSystemService(Activity.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> list = activityManager.getRunningTasks(100);
        int size = list.size();
        ActivityManager.RunningTaskInfo task;
        for (int i = 0; i < size; i++) {
            task = list.get(i);
            Log.v("栈id", "" + task.id);
            Log.v("栈底activity", task.baseActivity.getClassName());
            Log.v("栈顶activity", task.topActivity.getClassName());
            Log.v("栈中activity数量", task.numActivities + "");
            Log.v("栈结束", "===================================");
        }
    }
}

遗憾的是,只能获取栈中的顶和底两个activity信息,中间的都不知道。

在每个activity的onResume()方法中调用这个方法,查看控制台打印信息:

一、standard

栈id: 9
栈底: com.znke.android_task.AActivity
栈中: com.znke.android_task.BActivity
栈中: com.znke.android_task.CActivity
栈中: com.znke.android_task.DActivity
栈顶: com.znke.android_task.EActivity
栈: ===================================
栈id: 2
栈底: com.lenovo.launcher.Launcher
栈顶: com.lenovo.launcher.Launcher
栈: ===================================


 
A>B>C>D>E,5个activity顺序启动,都用标准模式。

发现整个进程中,出了activity的任务栈外,还有个Launcher的任务栈。

二、singleTop

栈id: 22
栈底: com.znke.android_task.AActivity
栈中: com.znke.android_task.BActivity
栈中: com.znke.android_task.CActivity
栈顶: com.znke.android_task.AActivity
栈: ===================================
栈id: 2
栈底: com.lenovo.launcher.Launcher
栈顶: com.lenovo.launcher.Launcher
栈: ===================================

A>B>C>A>A>A,启动顺序,A使用的是singleTop模式。栈顶上的A只有一份

三、singleTask


栈id: 20
栈底: com.znke.android_task.AActivity
栈顶: com.znke.android_task.AActivity
栈: ===================================
栈id: 2
栈底: com.lenovo.launcher.Launcher
栈顶: com.lenovo.launcher.Launcher
栈: ===================================

A>B>C>D>A启动顺序,A使用的是singleTask模式。栈顶还是A,只是它上面的其他activity全部没了



四、singleInstance

栈id: 14
栈底: com.znke.android_task.CActivity
栈中: com.znke.android_task.DActivity
栈顶: com.znke.android_task.EActivity
栈: ===================================
栈id: 13
栈底: com.znke.android_task.BActivity
栈顶: com.znke.android_task.BActivity
栈: ===================================
栈id: 12
栈底: com.znke.android_task.AActivity
栈顶: com.znke.android_task.AActivity
栈: ===================================
栈id: 2
栈底: com.lenovo.launcher.Launcher
栈顶: com.lenovo.launcher.Launcher
栈: ===================================


A和B用了singleInstance模式,其他的都是标准模式。





  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值