Подтвердить что ты не робот

Android N: Как запустить активность в текущем активном окне вместо второго окна при нажатии на уведомление в разделенном экране?

В Android N при использовании разделенного экрана я хочу запустить activity в текущем активном окне, когда пользователь нажимает на уведомление, но Android N всегда запускает activity во втором окне, если запускается нажатием на уведомление.

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

Когда получите intent, чем запуск activity.

 Intent in = new Intent(MainActivity.this, SecondActivity.class);
 startActivity(in);

ex - у меня есть два приложения на переднем плане, например браузер Chrome в первом окне и Facebook во втором окне. Теперь я что-то ищу в браузере Chrome, на данный момент я получаю уведомление Gmail. Теперь, когда я нажимаю на уведомление Gmail, чем приложение Gmail, открытое в втором окне, заменив Facebook, но я хочу, чтобы уведомление о моем приложении заменило Chrome (с которым пользователь взаимодействует) в первом окне.

4b9b3361

Ответ 1

Вы не можете

укажите в Intent, чтобы запустить Activity в задаче, к которой ваше приложение не входит, включая многооконные окна других приложений.

Существует несколько возможных сценариев:

  • Вы начинаете действие с другого действия, оно будет запущено в предыдущей задаче (и окне).
  • Вы можете включить флаг Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT в намерение, с флагом Intent.FLAG_ACTIVITY_NEW_TASK, чтобы запустить Activity в другом окне. Это будет работать, только если система уже находится в многооконном режиме и не гарантируется. Если система находится в режиме свободной формы (в отличие от разделенного экрана), это запрашивает запуск Activity в другом свободном плавающем окне, тогда вы также можете указать его размер с помощью .setLaunchBounds().
  • Вы запускаете Activity из службы, так как служба не может быть в задаче, вы должны указать флаг Intent.FLAG_ACTIVITY_NEW_TASK, и система запустит новую задачу для Activity.
  • Вы запускаете Activity из уведомления (PendingIntent), как и вы:
    • Вы можете сделать Intent перейти к Запуску, который уже запущен, и делать все, что вам нужно. Например, запустите Activity в другом окне с помощью Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT.
    • Если нет задач/окон с вашими действиями, система выберет, с чего начать, и вы не можете управлять этим. Вы можете контролировать, где начать работу в режиме свободной формы с помощью .setLaunchBounds(), но вы не можете захватить окно другого приложения, как вы хотите.

Вкратце:. Вы можете либо создавать новые окна, либо изменять существующие окна, вы не можете брать окна из других приложений.

Но если вы настаиваете

контролируя, на какой стороне экрана ваша новая активность будет занимать многоэкранное многоэкранное окно, затем создайте новую фиктивную активность. Вместо запуска SecondActivity запустите фиктивную операцию. В нем проверьте, на какой стороне экрана он был запущен. Один из способов, о котором я могу сейчас подумать, - называть . GetGlobalVisibleRect() на View и посмотреть, как значения сравниваются со всем размером экрана, Вы можете получить размер экрана таким образом:

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;

Вы также можете адаптировать это решение для определения размера клавиатуры для определения местоположения вашего окна. Это еще более взломанно.

Теперь, если вы на нужной стороне экрана, начните свой SecondActivity в обычном режиме и finish() фиктивный. Если вы ошибаетесь, также используйте флаг Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT, и ваше действие начнется на нужной стороне, в то время как фиктивная активность исчезнет.

Это грязный хак.. Я бы порекомендовал просто позволить системе выбрать, с чего начать свою деятельность.

Если вы всегда хотите заменить открытый браузер

затем заставьте браузер открыть ваше приложение, и оно займёт его задачу (и окно). Вы можете сделать это, открыв ссылку с Intent, с которой будет работать браузер, и оттуда перенаправить на ссылку, открывающую ваше приложение, см. Обработка Ссылки на приложения и Включение глубоких ссылок для получения дополнительной информации о том, как это сделать. Он должен работать.

Ответ 2

Вы не можете использовать действия для этой функции...

Решение Используйте Фрагменты вместо действий...

просто замените фрагменты, когда захотите

Ответ 3

Не можете ли вы проверить код ниже:

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