Мога ли да стартирам диалогова дейност от известие, така че да се показва над прозореца на приложението ми вместо на празен фон?

Пиша приложение с две основни дейности:

  • MainActiviy
  • DialogActivity

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