由LaunchMode引发的问题
来源:互联网 发布:could not read json 编辑:程序博客网 时间:2024/05/16 10:04
在做来往分享的时候,遇到了一个奇葩的问题。
我们的app(Foo)由一个LauncherActivity(L)启动,L在使用ApplicationContext启动MainActivity(M)之后finish自己。Scheme也统一由L接收,并转发至M。其中,M是singleTask的。
当通过Foo分享到来往之后,点击通过Scheme启动Foo,此时会出现L的闪屏页,但是不会留在M。点开Foo,发现已经打开了Scheme相应的页面。
初始栈状态:
这个诡异的问题是由于使用的Context有问题。
- 当来往启动L时,由于L是standard的,会把L放到来往的Task中
- L随即启动M,M由于是singleTask的,所以会将之前已经启动的Foo的Task中的M调起,但是,由于使用的是ApplicationContext,所以Foo的Task没有被拉起,仍然在来往的Task之下
- L finish自己,来往发起Scheme的页面恢复展示
解决方法是,把L也设置成singleTask的。
- 当来往启动L时,使用的是ActivityContext,全局无L的实例,会放到已存在的Foo的Task的栈顶,并将Foo的Task拉起
- L随即启动M,M是singleTask的,此时,由于有了一个Foo Task在最顶端,会新建一个M并放到L之上
- L finish自己,此时Foo的Task在来往之上
在L上设置taskAffinity是不能解决这个问题的。
- 问题在于启动L时,不会加入M的栈,而是在来往的栈,这个行为很诡异。待考证
由于把一个App的入口Activity设为SingleTask的,进行如下行为时:
1. Home切换台
2. 点击Launcher上的icon进入App
App的Task会被清空,所有行为不符合Android的用户习惯。所以,最后解决方法是:
- 将L做成透明Activity
- 使用L的ActivityContext启动闪屏页,闪屏页是SingleTask的,此时,Foo的Task被拉到最前端
- 最后使用ApplicationContext启动M
关于singleTask的好文章
关于singleTask的官方说明摘要如下:
- standard和singleTop在未指定taskAffinity的情况下,都会放到启动他们的Task中,区别只是singleTop如果在目标task中是栈顶元素,则不会被实例化。即便singleTop存在在某个栈中,只要不是目标栈,仍然会被实例化
- 由LaunchMode引发的问题
- 由Typedef引发的问题
- 由UseSubmitBehavior引发的问题
- 由static引发的问题
- 由引用引发的问题
- 由++操作引发的问题
- 由const引发的版本控制问题
- 由一个问题引发的思考
- 由py2exe引发的问题及解决方案
- 由object不能比较引发的问题
- 由 EditorBrowableAttribute 引发的一些问题
- Spinner(1): 由SDK引发的问题
- 由py2exe引发的问题及解决方案
- 由n阶幻方问题引发的思考
- 由webdings引发的乱码问题
- C/C++ 由fopen_s引发的问题
- 由jboss引发的 source level 问题
- 由localtime引发的函数可重入问题
- mybatis 源码系列 组件之 reflection
- javase学习之路--多态的形成以作用
- (七十七)地理编码与反地理编码
- uva 10361(字符串)
- smarty缓存机制
- 由LaunchMode引发的问题
- 获得当前打开的窗口标题
- topcoder decode
- 690 - Pipeline Scheduling
- Grimace IG 3.0 VX v3 iOS神器 新机 抹机 滴滴打车 快的打车 优步Uber 美团 大众 猫眼 陌陌 微信 携程 同城旅游 美团 大众 一号专车 微信解封 陌陌解封 之换ip篇
- Android自定义属性理解和应用
- 组合数
- JavaScript页面的简单运算
- WWDC总结:开发者需要知道的iOS 9 SDK新特性