源码记录一:activity与application,service,reciever中的context启动activity为什么不一样。

在开发中,总会遇到一些的reciever,接收到了之后需要进行打开页面的操作,一般的文档中说:需要添加FLAG_ACTIVITY_NEW_TASK,从该标签的解释看来:

创建该Activity置于栈底。如果这个Activity所在的Task已经在运行,那么将这个Task放到前台,并创建这个Activity置于栈顶。 

那么我们从源码中来看看为什么在使用application与receiver中的context的时候,需要进行这个设置。

activity的context来自activity的实例,那么他的startactivity是:

@Override
public void startActivity(Intent intent, @Nullable Bundle options) {
    if (options != null) {
        startActivityForResult(intent, -1, options);
    } else {
        // Note we want to go through this call for compatibility with
        // applications that may have overridden the method.
        startActivityForResult(intent, -1);
    }
}
覆盖了context的startactivity,没有过多的检查,或者说在activity的源码中已经将这个检查给规避掉了,在activity创建的时候就已经保证了自己的运行的地方。

那么在recevier或者是application的context中用startactivity的时候产生一个问题是,context使用的startactivity是默认方法,默认方法中有对task所在的保证。

官方文档中说:

Note that if this method is being called from outside of an Activity Context, then the Intent must include the FLAG_ACTIVITY_NEW_TASK launch flag. This is because, without being started from an existing Activity, there is no existing task in which to place the new activity and thus it needs to be placed in its own separate task.

明确说出了要在sevice中的startactivity要加上new_task的标签


而,application的继承也来自contextwrapper,所以在获取了application的context之后,要想startactivity也需要加上new_task的标签。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值