moto - Android N: ¿Cómo iniciar la actividad en la ventana activa actual en lugar de la segunda ventana cuando se hace clic en la notificación en pantalla dividida?
pantalla dividida nokia 6 (3)
En Android N
mientras uso la pantalla dividida, quiero iniciar la activity
en la ventana activa actual cuando el usuario hace clic en la notificación, pero Android N siempre inicia la activity
en la segunda ventana si se inicia haciendo clic en la notificación.
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.notification)
.setAutoCancel(false)
.setContentTitle("Demo Title")
.setContentText("Demo");
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra("myIntent", "test");
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(pendingIntent);
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = mBuilder.build();
notification.flags = Notification.FLAG_NO_CLEAR;
mNotificationManager.notify(156, notification);
Cuando se tiene intent
de lanzar la activity
.
Intent in = new Intent(MainActivity.this, SecondActivity.class);
startActivity(in);
ex: tengo dos aplicaciones en primer plano como el navegador Chrome en la primera ventana y Facebook en la segunda ventana. Ahora estoy buscando algo en el navegador Chrome, en este momento recibo una notificación de Gmail
. Ahora cuando hago clic en la notificación de Gmail que la aplicación de Gmail se abre en la segunda ventana al reemplazar Facebook, pero quiero que la notificación de mi aplicación reemplace a Chrome (quien interactúa con el usuario) en la primera ventana .
No se puede
especifique en una Intent
para iniciar una Actividad en una tarea de la que su aplicación no forma parte, lo que incluye ventanas de múltiples ventanas de otras aplicaciones.
Hay algunos escenarios posibles:
- Al iniciar una actividad desde otra actividad, se iniciará en la tarea (y ventana) de la actividad anterior.
- Puede incluir el indicador
Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT
en el intento, con el indicadorIntent.FLAG_ACTIVITY_NEW_TASK
para iniciar la actividad en otra ventana. Esto solo funcionará si el sistema ya está en modo de ventanas múltiples y no está garantizado. Si el sistema está en modo de forma libre (a diferencia de la pantalla dividida), esto solicita iniciar la Actividad en otra ventana flotante libre, entonces también puede especificar su tamaño con .setLaunchBounds() . - Inicia una Actividad desde un Servicio, ya que un Servicio no puede estar en una tarea, debe especificar el indicador
Intent.FLAG_ACTIVITY_NEW_TASK
, y el sistema inicia una nueva tarea para la Actividad. - Inicia una actividad desde una notificación (PendingIntent), como lo hace:
- Puedes hacer que la
Intent
vaya a una Actividad que ya haya comenzado y hacer lo que quieras en ella. Por ejemplo, inicie la actividad en otra ventana conIntent.FLAG_ACTIVITY_LAUNCH_ADJACENT
. - Si no hay tareas / ventanas con sus Actividades, el sistema elegirá dónde iniciarlo y usted no puede controlarlo . Puedes controlar dónde comenzar tu Actividad en modo libre con
.setLaunchBounds()
, pero no puedes secuestrar la ventana de otra aplicación como quieres hacer.
- Puedes hacer que la
En resumen: puede crear nuevas ventanas o cambiar las ventanas existentes que tiene, no puede tomar ventanas de otras aplicaciones.
Pero si insistes
en el control de qué lado de la pantalla ocupará su nueva Actividad en la ventana múltiple de pantalla dividida, a continuación, cree una nueva Actividad ficticia. En lugar de iniciar su actividad SecondActivity
inicie la actividad ficticia. En él, verifique en qué lado de la pantalla se inició. Una forma en la que puedo pensar ahora es llamar a .getGlobalVisibleRect() en una View
y ver cómo se comparan los valores con el tamaño de la pantalla completa. Puede obtener el tamaño de la pantalla de esta manera:
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
También puede adaptar esta solución de detección del tamaño del teclado para detectar la ubicación de su ventana. Aunque es aún más hacky.
Ahora, si está en el lado de la pantalla deseada, inicie su SecondActivity
normalmente y finish()
el dummy. Si está equivocado, utilice el indicador Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT
y su Actividad comenzará en el lado que desee, mientras que la Actividad ficticia desaparecerá.
Este es un truco sucio. Recomendaría dejar que el sistema elija dónde comenzar su actividad.
Si siempre quieres reemplazar un navegador abierto
luego haga que el navegador abra su aplicación y ocupará su tarea (y ventana). Puede hacerlo abriendo un enlace con un Intent
, que manejará el navegador, y desde allí, redirigir a un enlace que abre su aplicación, consulte Manejo de enlaces de aplicaciones y Habilitación de enlaces profundos para obtener más información sobre cómo hacerlo. Deberia de funcionar.
No puedes usar Actividades para esta funcionalidad ...
La solución es usar fragmentos en lugar de actividades ...
solo reemplaza los fragmentos cuando quieras
Podrías revisar el siguiente código:
private void Notify(String notificationMessage, String pushFullMessage) {
Intent intent = new Intent(this, GCMNotificationActivity.class);
intent.putExtra("pushNotification", pushFullMessage);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
final int not_nu = generateRandom();
PendingIntent pendingIntent = PendingIntent.getActivity(this,
not_nu, intent, PendingIntent.FLAG_ONE_SHOT);
android.support.v4.app.NotificationCompat.Builder notificationBuilder = new android.support.v4.app.NotificationCompat.Builder(
this)
.setSmallIcon(R.drawable.app_logo) //Small Icon from drawable
.setContentTitle(this.getString(R.string.app_name))
.setContentText(notificationMessage)
.setAutoCancel(true)
.setLocalOnly(true)
.setColor(this.getResources().getColor(R.color.green))
.setStyle(
new android.support.v4.app.NotificationCompat.BigTextStyle().bigText(notificationMessage))
// .setLargeIcon(BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_launcher)) //Big Icon from drawable
.setContentIntent(pendingIntent);
notificationBuilder.setPriority(Notification.PRIORITY_HIGH);
notificationBuilder.setDefaults(Notification.DEFAULT_SOUND);
notificationBuilder.setVibrate(new long[]{0, 100, 200, 300});
NotificationManager notificationManager = (NotificationManager) this
.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(not_nu, notificationBuilder.build());
}
public static int generateRandom() {
Random random = new Random();
return random.nextInt(9999 - 1000) + 1000;
}