Могу ли я запустить диалоговое действие из уведомления, чтобы оно отображалось в окне моего приложения, а не на пустом фоне?

Я пишу приложение с двумя основными действиями:

  • ГлавнаяАктивность
  • ДиалогАктивность

MainActivity — это типичное окно приложения, а DialogActivity — это активность, которую я стилизовал так, чтобы она отображалась как диалоговое окно, установив android:theme="@style/Theme.AppCompat.Light.Dialog"

Изнутри MainActivity я могу запустить DialogActivity со следующим кодом.

val intent = Intent(this, DialogActivity::class.java)
startActivity(intent)

Затем диалоговое окно появляется поверх основного, например:

введите здесь описание изображения

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

введите здесь описание изображения

Однако, если в настоящее время у меня открыта MainActivity, а затем нажмите на уведомление, диалоговое окно появится поверх пустого фона:

введите здесь описание изображения

Это происходит несмотря на то, что диалог появляется «поверх» основного окна активности на обзорном экране:

введите здесь описание изображения

Итак, вот мой вопрос: если у меня есть MainActivity на переднем плане, а затем я запускаю DialogActivity, нажав на соответствующее уведомление, могу ли я сделать так, чтобы DialogActivity отображалась поверх открытого окна MainActivity?

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

Я использую следующий PendingIntent для запуска действия из уведомления. Возможно, есть специальный набор флагов намерений, которые делают то, что я хочу? Или, может быть, мне нужно сделать что-то более радикальное, например, объединить два отдельных действия в одно?

val intent = Intent(this, DialogActivity::class.java)
intent.flags = 0
val pendingIntent = PendingIntent.getActivity(this, 0, intent, 0)

Скриншоты взяты из эмулятора под управлением Android 9 (уровень API 28).


person hugomg    schedule 26.10.2019    source источник
comment
Попробуйте запустить MainActivity из уведомления вместо DialogActivity и передать некоторые данные в MainActivity, чтобы указать, что вы запускаете его из уведомления, и если эти данные доступны, запустите DialogActivity   -  person hiddeneyes02    schedule 26.10.2019
comment
@hiddeneyes02 Я все еще хочу, чтобы оно выглядело как второе изображение, если я нажму на уведомление, когда открыто другое приложение. Есть ли способ сделать это, если я использую одно действие?   -  person hugomg    schedule 26.10.2019
comment
Вы пробовали это: stackoverflow.com/a/39691342/3016293   -  person hiddeneyes02    schedule 26.10.2019
comment
Спасибо, это было именно то, что я искал!   -  person hugomg    schedule 26.10.2019


Ответы (2)


Вместо перемещения DialogActivity запустите приложение, передав аргумент вместе с намерением, а затем обработайте значение аргумента. Исходя из этого, решите, запускать диалоговую активность или нет.

person Thirumalai    schedule 26.10.2019
comment
Я не хочу показывать окно MainActivity, если оно уже не открыто на переднем плане. Я все еще хочу, чтобы это выглядело как второе изображение, если другое приложение в настоящее время находится на переднем плане. Есть ли способ сделать это с помощью одного действия? - person hugomg; 26.10.2019

Ключом к достижению желаемого результата было установить android:taskAffinity="" в манифесте приложения. Полные шаги описаны в этом разделе документации. Возможно, также стоит прочитать этот связанный вопрос.

  1. В манифесте приложения задайте для taskAffinity пустую строку, чтобы диалоговое окно не закрывало старое окно приложения на обзорном экране.
  2. При желании установите excludefromRecents="true", чтобы диалоговое окно не отображалось как отдельная запись в обзоре. Он эффективно закрывается, если пользователь уходит от него.

    <activity
        android:name=".DialogActivity"
        android:theme="@style/Theme.AppCompat.Light.Dialog"
        android:excludeFromRecents="true"
        android:taskAffinity="">
    </activity>
    
  3. Передайте флаги NEW_TASK и CLEAR_TASK при запуске диалогового действия:

    val intent = Intent(this, DialogActivity::class.java)
    intent.flags = 
        Intent.FLAG_ACTIVITY_NEW_TASK or
        Intent.FLAG_ACTIVITY_CLEAR_TASK
    val pendingIntent = PendingIntent.getActivity(this, 0, intent, 0)
    
person hugomg    schedule 26.10.2019