由LaunchMode引发的问题

  在做来往分享的时候,遇到了一个奇葩的问题。
  我们的app(Foo)由一个LauncherActivity(L)启动,L在使用ApplicationContext启动MainActivity(M)之后finish自己。Scheme也统一由L接收,并转发至M。其中,M是singleTask的。
  当通过Foo分享到来往之后,点击通过Scheme启动Foo,此时会出现L的闪屏页,但是不会留在M。点开Foo,发现已经打开了Scheme相应的页面。
初始栈状态:

来往(TOP)Foo
来往MainM

  这个诡异的问题是由于使用的Context有问题。

  • 当来往启动L时,由于L是standard的,会把L放到来往的Task中
来往(TOP)Foo
L
来往MainM

- L随即启动M,M由于是singleTask的,所以会将之前已经启动的Foo的Task中的M调起,但是,由于使用的是ApplicationContext,所以Foo的Task没有被拉起,仍然在来往的Task之下

来往(TOP)Foo
L
来往MainM

- L finish自己,来往发起Scheme的页面恢复展示

来往(TOP)Foo
来往MainM

  解决方法是,把L也设置成singleTask的。

  • 当来往启动L时,使用的是ActivityContext,全局无L的实例,会放到已存在的Foo的Task的栈顶,并将Foo的Task拉起
来往Foo(TOP)
L
来往MainM

- L随即启动M,M是singleTask的,此时,由于有了一个Foo Task在最顶端,会新建一个M并放到L之上

来往Foo(TOP)
来往MainM

- L finish自己,此时Foo的Task在来往之上

来往Foo(TOP)
来往MainM

  在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存在在某个栈中,只要不是目标栈,仍然会被实例化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值