我有一个BroadcastReceiver,我正在使用它将数据发送到另一个可能正在运行或未运行的活动。我在onReceive()方法中使用intent,并使用putExtra()放入数据。然而,数据被发送到活动,即使活动已在运行并且在前台,活动的onCreate()方法也会被调用,所以我猜它正在创建一个新实例。我想只调用onResume(),或者如果它不存在我可以创建/启动意图的其他方式,如果它存在,只需让它'恢复'。现在,活动正在重建,我不希望这样。
public void onReceive(Context context, Intent intent) {
intent.setClass(context, MyActivity.class);
intent.putExtra("message", "the data here");
//intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Log.d("sending msg", "msg");
context.startActivity(intent);
}
如果我不使用FLAG_ACTIVITY_NEW_TASK,则抛出RuntimeException,特别告诉我如果我想从非活动的东西开始活动,我必须使用FLAG_ACTIVITY_NEW_TASK
。
答案 0 :(得分:6)
如果您想将可能正在运行的活动带到前面,并完成可能在其上的任何其他活动,您可以指定以下标志:
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
在这种情况下,当您收到此意图的活动已在运行时,将调用onNewIntent()
方法,而不是从头开始重新创建它。
如果您想在所需活动运行时(即将其移至堆栈顶部)简单地重新排序活动,请尝试以下操作:
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
答案 1 :(得分:1)
我认为您应该将android:launchMode =“singleTask”添加到您的清单上的活动声明中,或者使用标志FLAG_ACTIVITY_NEW_TASK启动活动意图,该标志与singleTask完全相同
如果活动已经存在于堆栈中的某个位置,则会通过调用onNewIntent()而不是onCreate()将其带到前面。
对不同的启动模式进行读取。非常重要的基础! :d http://developer.android.com/guide/topics/manifest/activity-element.html#lmode
http://developer.android.com/guide/topics/manifest/activity-element.html
答案 2 :(得分:1)
我最终重新广播(内部)我的BroadcastReceiver进入的解析信息。代码中的actvity,为事件注册,并在私有创建的接收器中有一个小的处理程序方法。这是一个很好的解决方案,因为我知道这个活动总是在我的情况下运行。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
receiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
Log.d("activity", "in local defined receiver");
if(intent.getAction().equals(CustomInternalSendSmsAction) )
{
handlePassedData(intent);
}
}
};
this.registerReceiver(receiver, new IntentFilter(CustomInternalSendSmsAction));
}