FLAG_ACTIVITY_REORDER_TO_FRONT被忽略,不起作用。

4

我有一个FragmentActivity,其中包含一个项目列表。当应用程序在后台运行时,可能会向该项目列表推送新的内容。

当发生这种情况时,我希望创建一个状态栏通知并提醒用户更新。
当用户点击通知时,活动应重新排序到前面,并在屏幕上显示,同时在列表底部显示新项目。

因此,我编写了一个通知管理器,在用户设备上展示这个功能:

private static void createNotification(String title, String text,
    String largeIcon, String itemdId, Context mCOntext) {

Bitmap ic = BitmapFactory.decodeResource(mContext.getResources(),
    R.drawable.ic_launcher);
Intent intent = new Intent(mContext, MyFragmentActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
intent.putExtra(MyFragmentActivity.SELECTED_ITEM_LIST_ID, DatabaseHelper
    .getItemListById(listId).getId());
PendingIntent pIntent = PendingIntent.getActivity(mContext, 0, intent,
    0);

Notification noti = new NotificationCompat.Builder(mContext)
    .setContentTitle(title).setContentText(text)
    .setSmallIcon(R.drawable.ic_launcher).setContentIntent(pIntent)
    .setAutoCancel(true).setLargeIcon(ic).build();
noti.defaults |= Notification.DEFAULT_LIGHTS;
noti.defaults |= Notification.DEFAULT_VIBRATE;
noti.sound = Uri.parse("android.resource://"
    + mContext.getPackageName() + "/" + R.raw.user_gets_message);

NotificationManager nm = (NotificationManager) mContext
    .getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(0, noti);
}

唯一的问题是,当我导航到片段活动并转到我的主屏幕(使应用程序处于后台)并获得推送时,它似乎忽略了我的标志。当我单击通知时,应用程序会创建一个新的Activity(或片段)并显示新的数据,而不是原始的数据。(这意味着单击返回按钮会打开历史堆栈中相同的Activity(或片段))。
我重写了onNewIntent和所有活动的生命周期方法,发现在点击返回时,调用的方法是MyFragmentActivity.onStart和MyFragmentActivity.onResume。
您认为我做错了什么?
2个回答

7
我猜想问题出在你将活动启动模式设置为singleTask,这会向你的意图添加标志FLAG_ACTIVITY_BROUGHT_TO_FRONT,并导致标志FLAG_ACTIVITY_REORDER_TO_FRONT被忽略。
你需要将启动模式更改为single top。

1
被标记为已接受的解决方案存在缺陷,除非我正在遵循一种特殊情况而您不是。如果您的launchmode =“singleTop”,并且您有一个打开活动A的通知,而您的应用程序此时正在查看活动B(无论应用程序是最小化还是最大化即在后台或前台都没有关系),那么即使设置了FLAG_ACTIVITY_REORDER_TO_FRONT标志,它仍将打开第二个副本活动A。
对我而言,解决方案是创建一个广播接收器来侦听通知触发的广播操作。所以基本上:
1. 通知触发带有要启动的活动名称的额外广播操作。 2. 广播接收器在单击通知时捕获此操作,然后使用FLAG_ACTIVITY_REORDER_TO_FRONT标志创建一个意图来启动该活动。 3. 活动被带到活动堆栈的顶部,不会有重复。

我同意你的观点,被采纳的答案并不起作用(已经测试了多次),而你的解决方案很好(类似于创建一个中间件活动来打开其他活动),但它仍然是一个糟糕的设计解决方案。 - MoxGeek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接