2

我有一个 BroadcastReceiver 用于将数据发送到另一个可能正在运行或未运行的活动。我在 onReceive() 方法中使用意图,并​​使用 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.

4

3 回答 3

7

如果您想将您可能正在运行的活动置于最前面,并完成可能在其之上的任何其他活动,您可以指定以下标志:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

在这种情况下,当接收到此意图的活动已在运行时,onNewIntent()将调用该方法,而不是从头开始重新创建它。

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

intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
于 2012-04-13T15:07:18.850 回答
1

我认为您应该将 android:launchMode="singleTask" 添加到清单上的活动声明中,或者使用标志 FLAG_ACTIVITY_NEW_TASK 启动活动意图,该标志与 singleTask 完全相同

如果 Activity 已经存在于堆栈中的某个位置,则通过调用 onNewIntent() 而不是 onCreate() 将其置于最前面。

对不同的启动模式进行阅读。非常重要的基础!:D http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

http://developer.android.com/guide/topics/manifest/activity-element.html

于 2012-04-13T15:09:26.707 回答
1

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

    @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));
}
于 2012-04-16T17:23:59.533 回答