Уведомление нажмите: действие уже открыто
у меня есть приложение с уведомлениями, которые открывают определенную активность, если я нажимаю на них. Я хочу, чтобы, если я нажму уведомление и действие уже открыто, это не начал снова, но просто вывел на передний план.
Я думал, что смогу сделать это с флагом FLAG_ACTIVITY_BROUGHT_TO_FRONT
или FLAG_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);
могу ли я управлять им с флагами или я должен хранить переменную в SharedPreferences, чтобы проверить, если он открыт или нет?
спасибо!
6 ответов:
вам нужно установить на
Activity
вы начинаетеsingleTop
. Это приведет к тому, что входящие намерения будут доставлены в существующий экземпляр вместо запуска нового экземпляра, когда этоActivity
уже находится в верхней части стека задачи.это делается в манифесте, добавив
android:launchMode="singleTop"
до<activity>
элемент. Чтобы получить доступ к последнему намерению (если вас интересуют любые данные, которые могли быть переданы вместе с ним), переопределитеonNewIntent()
в вашейActivity
.
попробуйте установить флаги .
С документация для FLAG_ACTIVITY_CLEAR_TOP (выделено мной):
если установлено, и запускаемое действие уже выполняется в текущая задача, а затем вместо запуска нового экземпляра этого деятельность, все другие виды деятельности на нем будут закрыты и это намерение будет доставлено в (теперь сверху) старую деятельность в качестве новое намерение.
например, рассмотрим задачу, состоящую из действий: A, B, C, D. Если D вызывает startActivity() с намерением, которое разрешает компонент деятельности B, тогда C и D будут закончены и B получит данное намерение, в результате чего стек теперь является: A, B.
текущий экземпляр действия B в приведенном выше примере будет либо получите новое намерение, которое вы начинаете здесь в своем метод onNewIntent (), или сам будет завершен и перезапущен с помощью новый намерение. Если он объявил свой режим запуска "множественным" (the по умолчанию) и вы не установили FLAG_ACTIVITY_SINGLE_TOP в том же намерение, тогда оно будет закончено и воссоздано; для всех других запусков режимы или если FLAG_ACTIVITY_SINGLE_TOP установлен, то это намерение будет доставлено в текущий экземпляр 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());
просто скопируйте код и вставьте его в свою основную активность запуска.
Я думаю, вы должны добавить некоторую логику, чтобы заставить его работать, может быть, это может помочь:
например, у меня есть заставка (пусковая и главная) приложения:
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()); } }