在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的效果是一样的