将数据发送到可能已启动的另一个活动

时间:2012-04-13 14:57:36

标签: android android-activity

我有一个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

3 个答案:

答案 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));
}