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

Android 将数据发送到另一个可能启动的活动,android,android-activity,Android,Android Activity,我有一个BroadcastReceiver,我正在使用它将数据发送到另一个可能正在运行或可能没有运行的活动。我在onReceive()方法中使用intent,并使用putExtra()将数据放入。数据被发送到活动,但是,即使活动已经在前台运行,也会调用活动的onCreate()方法,因此我猜它正在创建一个新实例。我只想调用onResume(),或者如果intent不存在,我可以用其他方法创建/启动它,如果它存在,就让它“恢复”。现在,正在重新创建活动,我不希望出现这种情况 public void

我有一个BroadcastReceiver,我正在使用它将数据发送到另一个可能正在运行或可能没有运行的活动。我在onReceive()方法中使用intent,并使用putExtra()将数据放入。数据被发送到活动,但是,即使活动已经在前台运行,也会调用活动的onCreate()方法,因此我猜它正在创建一个新实例。我只想调用onResume(),或者如果intent不存在,我可以用其他方法创建/启动它,如果它存在,就让它“恢复”。现在,正在重新创建活动,我不希望出现这种情况

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\u ACTIVITY\u NEW\u TASK,就会抛出一个RuntimeException,特别是告诉我,如果我想从非活动开始一个活动,如果你想把可能正在运行的活动放在前面,并完成可能在上面的任何其他活动,我必须使用
FLAG\u ACTIVITY\u NEW\u TASK
,您可以指定以下标志:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
在这种情况下,当接收此意图的活动已在运行时,将调用
onNewIntent()
方法,而不是从头开始重新创建它

如果希望在所需活动正在运行时简单地对活动重新排序(即将其移动到堆栈顶部),请尝试以下操作:

intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

我认为您应该将android:launchMode=“singleTask”添加到清单上的活动声明中,或者使用与singleTask完全相同的标志&u activity\u NEW\u TASK启动活动意图

如果活动已存在于堆栈中的某个位置,则通过调用onNewIntent()而不是onCreate()将其带到前端

在上读取不同的启动模式。非常重要的基础知识!:D

我最终(在内部)重播了广播接收器接收到的解析信息。Activity(代码中)为事件注册,在私有创建的接收器中有一个小的处理程序方法。这是一个很好的解决方案,因为我知道在我的情况下,此活动将始终运行

    @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));
}

它仍然要求我使用FLAG\u ACTIVITY\u NEW\u TASK。我应该使用您上面指定的标志吗?我尝试过执行Clear Top、Single Top和New Task的OR,但是活动没有像我刚刚执行New_Task时那样接收数据。您是否覆盖了onNewintent()?我正在使用我在帖子中提到的FLAG_activity_New_Task。它仍然在调用onCreate(),你没有按那个活动,是吗?我不明白你的问题。由于日志记录,我知道它再次调用onCreate()。它正在创建一个新实例并显示它。好吧,假设您已启动该活动。调用onCreate()时,是否按了后退按钮并关闭了该活动?如果您这样做了,那么每次onCreate都会被调用,不是吗?仅当您导航到其他位置并且该活动仍存在于某个位置时,才会调用onNewIntent。。你可以尝试使用FLAG_ACTIVITY_REORDER_TO_front我从不按“back”。意图始终处于前台。此解决方案是一种变通方法。这对你来说可能没问题,但不应该被标记为正确答案。其他寻求这个问题答案的人也会来这里。@selalerer,我不觉得这是一种变通方法,对其他人也会有用。尽管如此,我愿意接受更好的解决方案。如果您有更好的解决方案,那么请务必将其包括在此处。