【问题标题】:FLAG_ACTIVITY_REORDER_TO_FRONT ignoredFLAG_ACTIVITY_REORDER_TO_FRONT 被忽略
【发布时间】:2013-01-23 14:49:48
【问题描述】:

我有一个带有项目列表的 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);
}

唯一的问题是它似乎忽略了我的标志,当我导航到片段活动,然后转到我的主屏幕(后台应用程序)并获得推送时,当我点击通知时,应用程序创建一个新的活动(或片段)并显示新的活动,而不是带有新数据的原始活动。 (这意味着单击后退按钮会从历史堆栈中打开相同的活动(或片段)。

我重写了onNewIntent 和活动的所有生命周期方法,我看到在单击后退时,调用的方法是MyFragmentActivity.onStartMyFragmentActivity.onResume

对我做错了什么有什么想法吗?

【问题讨论】:

    标签: android android-intent android-pendingintent


    【解决方案1】:

    我认为问题在于您将活动启动模式设置为 singleTask,这会将标志 FLAG_ACTIVITY_BROUGHT_TO_FRONT 添加到您的意图中,并导致标志 FLAG_ACTIVITY_REORDER_TO_FRONT 被忽略。

    您需要将启动模式更改为单顶。

    【讨论】:

      【解决方案2】:

      标记为已接受的解决方案存在缺陷,除非我正在关注特殊情况而您没有关注。如果您有launchmode =“singleTop”并且您有一个打开活动A的通知,并且您的应用程序正在查看活动B(应用程序最小化或最大化,即在后台或前台没关系)然后即使FLAG_ACTIVITY_REORDER_TO_FRONT 标志已设置,它仍会打开活动 A 的第二个副本。

      我的解决方案是制作一个广播接收器来监听通知触发的广播动作。所以基本上:

      1. 通知触发广播操作,其中包含要启动的活动名称。

      2. 广播接收器在点击通知时捕捉到这一点,然后使用 FLAG_ACTIVITY_REORDER_TO_FRONT 标志创建启动该活动的意图

      3. 活动被带到活动堆栈的顶部,没有重复。

      【讨论】:

      • 我同意你的观点,接受的答案不起作用(经过多次测试),你的解决方案工作正常(就像创建一个中间件活动来打开其他活动)但它仍然是一个糟糕的设计解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      • 2016-06-05
      • 2014-02-25
      • 2011-05-09
      • 2015-02-08
      • 2011-03-27
      • 2010-11-19
      相关资源
      最近更新 更多