我有一个带有项目列表的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而不是原始的Activity。 (这意味着单击后退按钮可从历史堆栈中打开相同的活动(或片段)。
我重写了onNewIntent
和活动的所有生命周期方法,我看到在后面点击时,调用的方法是MyFragmentActivity.onStart
和MyFragmentActivity.onResume
。
关于我做错了什么的任何想法?
答案 0 :(得分:6)
我认为问题在于您将活动启动模式设置为singleTask,将标志FLAG_ACTIVITY_BROUGHT_TO_FRONT添加到您的意图中,并导致标志FLAG_ACTIVITY_REORDER_TO_FRONT被忽略。
您需要将启动模式更改为单顶。
答案 1 :(得分:1)
标记为已接受的解决方案存在缺陷,除非我遵循特殊情况并且您不是。如果你有launchmode =" singleTop"你有一个通知打开活动A,你的应用程序正在查看活动B(应用程序最小化或最大化,即在背景或前景中它并不重要)然后即使设置了FLAG_ACTIVITY_REORDER_TO_FRONT标志,它仍然会打开活动A的第二份副本。
我的解决方案是制作一个广播接收器,监听通知触发的广播动作。所以基本上:
通知触发广播操作,并附加要启动的活动的名称。
广播接收器在单击通知时捕获此信息,然后使用FLAG_ACTIVITY_REORDER_TO_FRONT标志创建启动该活动的意图
活动被带到活动堆栈的顶部,没有重复。