您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168888

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

Activity启动模式随想录

前言

记录本人对Activity启动模式的新理解

1.指定启动模式的两种方式

方式一:在Menifest文件中指定launchMode属性
方式二:启动Activity的时候,指定Flags(这种方式优先级更高)

2.启动的Bug示例

当一个非Activity类型的Context去启动Activity的时候就会报错。这是因为非Activity类型的Context(如ApplicationContext)并没有所谓的任务栈。
比如ActivityA要启动ActivityB,以standard模式启动。那么B肯定要进入A所在的任务栈,但是如果是ApplicationContext启动的ActivityB,ApplicationContext都没有任务栈,所以会报错。

3.什么是任务栈

说的比较抽象,其实可以理解为一个参数:taskAffinity。在manifest文件中设置即可。这个参数标识了一个Activity所需要的任务栈名字。默认情况下所有Activity所需的任务栈的名字都为应用的包名。

任务栈分为前台任务栈和后台任务栈,后台任务栈中的Activity处于暂停状态,用户可以通过切换将后台任务栈再次调到前台。

4.Activity启动常用的Flags

FLAG_ACTIVITY_NEW_TASK:相当于singleTask启动模式
FLAG_ACTIVITY_SINGLE_TOP:相当于singleTop启动模式
FLAG_ACTIVITY_CLEAR_TOP:我个人觉得效果和singleTask启动模式一样

5.一个例子,把启动模式理解透

有几个Activity,分别是A,B,C,其中A是standard启动模式,taskAffinity默认的为包名。而B和C是singleTask启动模式,taskAffinity"com.ljh.newtask"。那么请问:在A中启动B,B中启动C,C中启动A,A中又启动B。然后连续按两次返回键,最后的页面是什么?

分析:A启动B,会为B创建一个新的任务栈即"com.ljh.newtask"任务栈,并把B放入栈中。然后B启动C,会发现C所需要的任务栈已经创建好了,就直接创建C然后入栈就好了。C启动A,因为A是standard,所以直接创建A,并加入C所在的任务栈,此时任务栈里面是B-C-A,B位于栈底。然后再启动B,因为B是singleTask,所以会栈内复用,将C和A移出栈,此时栈中就只有B了。这时候按第一次返回键,B出栈,B所在的任务栈也不存在了。此时只能回到后台任务栈然后把A显示出来。然后继续按第二次返回键,A也出栈。然后就回到桌面了。


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进