参考文章:基础总结篇之二 Activity的四种launchMode
其实上面的博客已经写得很好了,但是就singleTask和singleInstance,如果自己没有动手测试过的话还是不能充分的活用的;下面就Activity的4大启动模式我个人有点不不成熟的总结让大家品品 (^_^);
第一种: standard (标准模式)
老实说,我做项目到现在几乎用不上这种模式, 他就好比是会克隆(别钻牛角尖,克隆虽然连DNA都一样,但是出生时间就不一样)的一个模式,可以自己启动自己,两个Activity大致一样,除了序列号等信息; 四种模式只有 standard 能有在任务栈中生成一个与自己很像的一个兄弟;
startActivity(new Intent(MainActivity.this, MainActivity.class));
上面这句代码在 standard 模式中运行会重新生成一个Activity;而在其他3种模式中运行,则只会重新调用 onPause 和onResume方法而已,序列号也不会改变;
总结: 调用startActivity(new Intent(MainActivity.this, MainActivity.class));后能重新生成实例的模式就是standard(标准模式).
第二种:singleTop (栈顶模式)
据我个人测试发现, 这种模式一句话描述就是不能重新生成自己的standard(标准模式); 也许我调查得不够深吧.我反复测试过,除standard(标准模式)外,其余3种模式调用 startActivity(new Intent(MainActivity.this, MainActivity.class)); 时都只是调用了自身的 onPause 和 onResume 2个生命周期方法;所以我才给出以上的结论.
总结: 调用startActivity(new Intent(MainActivity.this, MainActivity.class));后不能重新生成自己.
第三种:singleTask (单任务模式)
这个是今天的重头戏, singleTask (单任务模式) ,还记得看过的博客优雅的退出所有Activity吗, 只要把这个模式弄懂那就是很easy的一件事;
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
重中之重: 两点:
1,将目标 Activity 设置为 singleTask 模式;
2 跳转时加上这句代码,intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
这样一来除当前Activity以外的Activity都被finish掉了;
总结:能够清除掉同Task栈内其他所有Activity的启动模式.
第四种:singleInstance (单例模式)
这种模式我个人做了个情景设想: 我们把小明家看成是一个Task栈,小强家看成是另一个Task栈;好了,现在小明家是singleInstance 单例模式; 情景是:
1, 当小明去小强家玩的时候, 不管多晚, 小明最终会回到自己家.
2, 当小强来小明家玩的时候, 不管多晚, 小强最终会回到自己家.
3, 当小强来小明家邀请小明到小强家玩, 不管多晚, 小明最终会回到自己家.
具体的说就是,
1,不管是不是单例模式, 只要是发起 startActivity 的 Task 栈, 最终都会回到自己的栈依次返回.(比如:从A跳转到B,再跳转到单例模式C,但是C没有执行跳转,而是直接返回到了B, 那么这个时候,当B返回时,到了A,当A返回时,程序就退出了,而不会跳转到C)
2,单例模式的特性是,不管单例模式是不是最初启动的那个Activity,只要是该单例模式发起的startActivity,那么,当其他Task栈finish后,最后会回到单例模式所在的Task栈, 也就是上述第3种情景.
总结: 当单例模式发起 startActivity 后(不管重复多少次,只要最后一次是单例模式发起的跳转), 退出时,会先逐次finish掉其他Task栈内的所有Activity, 然后再返回单例模式所在的Task栈.(TaskId 可以区分)
好了,很抽象, 哈哈, 自己多测试下, 然后才能深刻理解, 实践出真知啊!
DEMO传送门: https://download.csdn.net/download/u012137924/13081442