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

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

  • MainActiviy
  • DialogActivity

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

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

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

Диалоговое окно появится надосновной такой:

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here

Итак, вот мой вопрос : Если у меня 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 Level 28)

Ответы [ 2 ]

1 голос
/ 26 октября 2019

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

0 голосов
/ 26 октября 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)
    
...