通知点击:活动已经打开

我有一个应用程序通知,如果我点击它们打开某个活动。 我想要的是,如果我点击通知并且活动已经打开,那么它不会再次启动,而只是展现在前面。

我想我可以用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); 

我可以用标志来pipe理它,还是应该在SharedPreferences中存储一个variables来检查它是否被打开?

谢谢!

您需要设置您开始singleTopActivitylaunchMode属性。 这将导致传入的意图被传递到现有的实例,而不是启动一个新的实例,当该Activity已经在任务的堆栈的顶部。

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

尝试将标志设置为Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP来代替。

从FLAG_ACTIVITY_CLEAR_TOP的文档 (重点是我的):

如果已设置,并且正在启动的活动已在当前任务中运行,则不是启动该活动的新实例,而是closures其上的所有其他活动,并将此Intent交付给(现在开启顶端)旧活动作为一个新的意图。

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

在上面的例子中,当前正在运行的活动B的实例将会在onNewIntent()方法中接收到你从这里开始的新的意图,或者自己完成并重新启动新的意图。 如果它已经声明它的启动模式是“多个”(默认),并且你没有在同一个意图中设置FLAG_ACTIVITY_SINGLE_TOP,那么它将被完成和重新创build; 对于所有其他启动模式,或者如果设置了FLAG_ACTIVITY_SINGLE_TOP,则这个Intent将被传递到当前实例的onNewIntent()。

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

onNewIntent从新的意图(由新通知服务)获取新数据并捕获它们,例如:

title = intent.getStringExtra("title")

onCreate之前:)

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

你也可以按照这个教程: http : //androidrace.com/2016/12/10/how-to-refresh-activity-on-new-notification-click-android-developer/

 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()); 

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

这是原答复

我想你应该添加一些逻辑来使其工作,也许这可以帮助:

例如,我有一个启animation面(启动和主要)的APP:

 public class SplashScreen extends AppCompatActivity { private final int TIME_OUT = 2000; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash_screen); // Suscribirse al tema Notificaciones FirebaseMessaging.getInstance().subscribeToTopic("NOTA"); if (getIntent().getExtras() != null) { if (getIntent().getExtras().size()>1){ Intent home_activity = new Intent(getApplicationContext(), Home.class); home_activity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); if (getIntent().getExtras() != null) { for (String key : getIntent().getExtras().keySet()) { String value = "" + getIntent().getExtras().getString(key); Log.d("TAG", key + "=" + value); switch (key) { case "url": home_activity.putExtra("url", value); break; } } } startActivity(home_activity); finish(); }else{ new Handler().postDelayed(new Runnable() { @Override public void run() { try { Intent home_activity = new Intent(getApplicationContext(), Home.class); home_activity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(home_activity); finish(); } catch (Exception ex) { ex.printStackTrace(); } } }, TIME_OUT); } } else { new Handler().postDelayed(new Runnable() { @Override public void run() { try { Intent home_activity = new Intent(getApplicationContext(), Home.class); home_activity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(home_activity); finish(); } catch (Exception ex) { ex.printStackTrace(); } } }, TIME_OUT); } } } 

在我的FirebaseService中,我完成了以下工作:

 public class FCMessagingService extends FirebaseMessagingService { private final String TAG = "PUSH"; private String body = ""; private static String _url = ""; private static int numMessage = 0; @Override public void onMessageReceived(RemoteMessage remoteMessage) { super.onMessageReceived(remoteMessage); String from = remoteMessage.getFrom(); Log.d(TAG, "Mensaje recibido de: " + from); if (remoteMessage.getNotification() != null) { Log.d(TAG, "Notificación: " + remoteMessage.getNotification().getBody()); if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Data: " + remoteMessage.getData()); try { JSONObject data = new JSONObject(remoteMessage.getData()); String url = data.getString("url"); Log.d(TAG, "onMessageReceived: \n" + "Extra Information: " + url); this._url = url; Log.d("_URL",_url); mostrarNotificacion(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody()); mensaje(url, remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody()); } catch (JSONException e) { e.printStackTrace(); } } } } private void mensaje(String url, String title, String body){ boolean acti = Util.comprobarActivityALaVista(getApplicationContext(), "com.dev.android.subagan.MainActivity"); if(acti){ Intent imain = new Intent(MainActivity.URL); imain.putExtra("key_url",url); imain.putExtra("key_title",title); imain.putExtra("key_body",body); LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(imain); }else{ Intent ihome = new Intent(Home.URL); ihome.putExtra("key_url",url); ihome.putExtra("key_title",title); ihome.putExtra("key_body",body); LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(ihome); } } private void mostrarNotificacion(String title, String body) { final int NOTIFICATION_ID = 3000; Intent intent = new Intent(this, MainActivity.class); intent.putExtra("url",_url); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT ); Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle(title) .setContentText(body) .setAutoCancel(true) .setSound(soundUri) .setTicker(body) .setContentIntent(pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0, notificationBuilder.build()); } }