Android初学习 - 在BroadcastReceiver中启动Activity的问题

127 篇文章 0 订阅
  在BroadcastReceiver中启动Activity:
  
  如果在BroadcastReceiver的onReceive()方法中如下启动一个Activity
  Intent intent=new Intent(context,AnotherActivity.class);
  context.startActivity(intent);
  可捕获异常信息:
  android.util.AndroidRuntimeException: 
  Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. 
  Is this really what you want?
  它说明:在Activity的context(上下文环境)之外调用startActivity()方法时
  需要给Intent设置一个flag:FLAG_ACTIVITY_NEW_TASK
  
  所以在BroadcastReceiver的onReceive()方法中启动Activity应写为:
  Intent intent=new Intent(context,AnotherActivity.class);
  intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  context.startActivity(intent);
  
  
  之前描述了问题的现象和解决办法,现在试着解释一下原因:
  1 在普通情况下,必须要有前一个Activity的Context,才能启动后一个Activity
  2 但是在BroadcastReceiver里面是没有Activity的Context的
  3 对于startActivity()方法,源码中有这么一段描述:
    Note that if this method is being called from outside of an
    {@link android.app.Activity} Context, then the Intent must include
    the {@link Intent#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.
    说白了就是如果不加这个flag就没有一个Task来存放新启动的Activity.
    
  4 其实该flag和设置Activity的LaunchMode为SingleTask的效果是一样的
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值