通知单击:活动已打开

PX *_*per 154 notifications android android-activity

我有一个带有通知的应用程序,如果我点击它们就会打开某个活动.我想要的是,如果我点击通知并且活动已经打开,它就不会再次启动,而是会被带到前面.

我以为我可以用国旗做FLAG_ACTIVITY_BROUGHT_TO_FRONTFLAG_ACTIVITY_REORDER_TO_FRONT,但它一直再次打开它,所以我有两次活动.

这是我的代码:

event_notification = new Notification(R.drawable.icon,
            mContext.getString(R.string.event_notif_message), System.currentTimeMillis()); 
Intent notificationIntent = new Intent(mContext, EventListActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
sendNotification(event_notification, notificationIntent, mContext.getString(R.string.event_notif_title),
                body, Utils.PA_NOTIFICATIONS_ID);
Run Code Online (Sandbox Code Playgroud)

我可以使用标志管理它,还是应该在SharedPreferences中存储变量以检查它是否已打开?

谢谢!

Dev*_*red 278

您需要设置您正在开始的launchMode属性.这将导致传入的Intent传递到现有实例,而不是在已经位于任务堆栈顶部时启动新实例.ActivitysingleTopActivity

这是通过添加android:launchMode="singleTop"<activity>元素在清单中完成的.要访问最新的Intent(如果您对可能已经传入的任何数据感兴趣),请覆盖onNewIntent()您的Activity.

  • 我遇到了很多答案,说明了各种事物的意图旗帜.这没用.这是因为无论其标志如何,意图都将进入新创建的活动?我问,因为Devunwired说launchMode属性改变了Intent的交付地点. (6认同)
  • 文档页面位于http://developer.android.com/guide/topics/manifest/activity-element.html#lmode (5认同)

qui*_*int 34

请尝试将标志设置为Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP.

FLAG_ACTIVITY_CLEAR_TOP(强调我的)的文档:

如果已设置,并且正在启动的活动已在当前任务中运行,则不会启动该活动的新实例,而是将关闭其上的所有其他活动,并将此Intent传递给(现在开启) top)旧活动作为新的意图.

例如,考虑一个由活动组成的任务:A,B,C,D.如果D调用带有解析为活动B组件的Intent的startActivity(),则C和D将完成,B接收给定的Intent ,导致堆栈现在是:A,B.

上面示例中当前运行的活动B实例将在其onNewIntent()方法中接收您从此处开始的新意图,或者本身已完成并使用新意图重新启动.如果它已将其启动模式声明为"多个"(默认值)并且您没有在同一意图中设置FLAG_ACTIVITY_SINGLE_TOP,那么它将被完成并重新创建; 对于所有其他启动模式或如果设置了FLAG_ACTIVITY_SINGLE_TOP,则此Intent将被传递到当前实例的onNewIntent().


小智 5

Notification.Builder mBuilder =
            new Notification.Builder(this)
            .setSmallIcon(R.drawable.cmplayer)
            .setContentTitle("CoderoMusicPlayer")
            .setContentText("PLayer0!");

    Intent resultIntent = new Intent(this, 

    AndroidBuildingMusicPlayerActivity.class);
        resultIntent.setAction(Intent.ACTION_MAIN);
        resultIntent.addCategory(Intent.CATEGORY_LAUNCHER);

        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                resultIntent, 0);

        mBuilder.setContentIntent(pendingIntent);
        NotificationManager mNotificationManager =
            (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        mNotificationManager.notify(1, mBuilder.build());
Run Code Online (Sandbox Code Playgroud)

只需复制代码并将其粘贴到您的主启动器活动中即可。

这是原答案


小智 5

使用onNewIntent()从通知点击处理新数据并刷新活动。

onNewIntent得到新的目的,新的数据(其中担任由新通知),并抓住他们,例如:

title = intent.getStringExtra("title")

onCreate以前:)

它将使用新的通知数据刷新当前活动。

您也可以按照本教程进行操作。