studio programacion herramientas fundamentos con avanzado aplicaciones android notifications android-activity

android - programacion - Clic de notificación: actividad ya abierta



manual de android en pdf (5)

Creo que deberías agregar algo de lógica para que funcione, quizás esto ayude:

Por ejemplo, tengo una pantalla de inicio (iniciador y PRINCIPAL) de la aplicación:

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

Y en mi FirebaseService he hecho lo siguiente:

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

Tengo una aplicación con notificaciones que abren cierta actividad si hago clic en ellas. Quiero que, si hago clic en la notificación y la actividad ya está abierta, no se inicia de nuevo, sino que acaba de llegar al frente.

Pensé que podía hacerlo con la bandera FLAG_ACTIVITY_BROUGHT_TO_FRONT o FLAG_ACTIVITY_REORDER_TO_FRONT , pero la sigue abriendo, así que tengo la actividad dos veces.

Este es mi código:

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

¿Puedo gestionarlo con flags o debería almacenar una variable en SharedPreferences para verificar si está abierto o no?

¡Gracias!


Intenta configurar las banderas en Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP en Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP lugar.

De la documentación para FLAG_ACTIVITY_CLEAR_TOP (énfasis mío):

Si se establece, y la actividad que se está iniciando ya se está ejecutando en la tarea actual, en lugar de lanzar una nueva instancia de esa actividad, todas las demás actividades que se encuentren encima se cerrarán y esta intención se entregará al (ahora encendido arriba) actividad anterior como un nuevo propósito.

Por ejemplo, considere una tarea que consista en las actividades: A, B, C, D. Si D llama a startActivity () con un Intento que se resuelve en el componente de la actividad B, entonces C y D estarán terminados y B recibirá el Intento dado , dando como resultado que la pila sea ahora: A, B.

La instancia actualmente en ejecución de la actividad B en el ejemplo anterior recibirá el nuevo intento que está comenzando aquí en su método onNewIntent (), o se terminará y se reiniciará con el nuevo intento. Si ha declarado que su modo de lanzamiento es "múltiple" (el valor predeterminado) y no ha configurado FLAG_ACTIVITY_SINGLE_TOP en el mismo intento, entonces se terminará y se volverá a crear; para todos los demás modos de ejecución o si se establece FLAG_ACTIVITY_SINGLE_TOP, este Intent se entregará a la instancia actual onNewIntent ().


Use onNewIntent() para manejar datos nuevos desde el clic de notificación y actualice la actividad.

En onNewIntent obtenga los nuevos datos del nuevo intento (que sirvió para la nueva notificación) y péguelos, por ejemplo:

title = intent.getStringExtra("title")

en onCreate previamente :)

Actualizará la actividad actual con nuevos datos de notificación.

También puede seguir este tutorial: http://androidrace.com/2016/12/10/how-to-refresh-activity-on-new-notification-click-android-developer/


launchMode establecer el atributo launchMode de la Activity que está comenzando a singleTop . Esto hará que los Intents entrantes se entreguen a la instancia existente en lugar de comenzar una nueva instancia cuando esa Activity ya se encuentra en la parte superior de la pila de la tarea.

Esto se hace en el manifiesto agregando android:launchMode="singleTop" al elemento <activity> . Para acceder a la intención más reciente (si le interesan los datos que puedan haber pasado con ella), anule onNewIntent() en su Activity .


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

Simplemente copie el código y péguelo en su actividad de inicio principal.

Aquí está la respuesta original