Мой текущий поток следующий:
- Пользователь входит в основное действие A
- Затем пользователь запускает действие B, которое является единственным экземпляром.
- Затем действие B запускает службу переднего плана.
Метод, который запускает службу переднего плана
public static void startService(Activity activity) {
Intent serviceIntent = SomeService.newIntent(activity);
ContextCompat.startForegroundService(activity, serviceIntent);
}
Сервис onStartCommand
Notification notification = getNotification();
startForeground(1, notification);
return START_NOT_STICKY;
Манифест
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
...
<activity
android:name="com.proj.activities.ActivityA"
android:screenOrientation="portrait" />
...
<activity
android:name="com.proj.activities.ServiceActivityB"
android:launchMode="singleInstance"
android:screenOrientation="portrait" />
...
<service
android:name="com.proj.SomeService"
android:foregroundServiceType="location" />
Следующие действия поддерживают мой единственный экземпляр в Android 11 и предыдущей версии.
- Если активность B сведена к минимуму, служба переднего плана остается активной.
- Если пользователь запускает действие A из действия B (singleInstance), служба переднего плана остается активной.
Действие A запускает B:
Intent activityBIntent = new Intent(activity, ServiceActivityB.class);
activity.startActivity(activityBIntent);
Журналы:
* Task{328c3ce #30946 visible=true type=standard mode=fullscreen translucent=false A=10480:com.company.name U=0 StackId=30946 sz=1}
mLastOrientationSource=ActivityRecord{b2900c9 u0 com.company.name/com.proj.activities.ServiceActivityB t30946}
bounds=[0,0][1080,2280]
* ActivityRecord{b2900c9 u0 com.company.name/com.proj.activities.ServiceActivityB t30946}
* Task{de6d50d #30945 visible=true type=standard mode=fullscreen translucent=false A=10480:com.company.name U=0 StackId=30945 sz=2}
mLastOrientationSource=ActivityRecord{58892bb u0 com.company.name/com.proj.activities.SpringboardActivity 30945}
bounds=[0,0][1080,2280]
* ActivityRecord{58892bb u0 com.company.name/com.proj.activities.ActivityA t30945}
* ActivityRecord{183c336 u0 com.company.name/com.proj.activities.SpringboardActivity t30945}
Актив Б запускает А:
Intent activityAIntent = new Intent(activity, ActivityA.class);
activityAIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
activity.startActivity(activityAIntent);
Журналы:
* Task{de6d50d #30945 visible=true type=standard mode=fullscreen translucent=false A=10480:com.company.name U=0 StackId=30945 sz=2}
mLastOrientationSource=ActivityRecord{58892bb u0 com.company.name/com.proj.activities.SpringboardActivity t30945}
bounds=[0,0][1080,2280]
* ActivityRecord{58892bb u0 com.company.name/com.proj.activities.ActivityA t30945}
* ActivityRecord{183c336 u0 com.company.name/com.proj.activities.SpringboardActivity t30945}
* Task{328c3ce #30946 visible=true type=standard mode=fullscreen translucent=false A=10480:com.company.name U=0 StackId=30946 sz=1}
mLastOrientationSource=ActivityRecord{b2900c9 u0 com.company.name/com.proj.activities.ServiceActivityB t30946}
bounds=[0,0][1080,2280]
* ActivityRecord{b2900c9 u0 com.company.name/com.proj.activities.ServiceActivityB t30946
Но в Android 11, в отличие от предыдущих версий Android, если пользователь запускает действие A из действия B (singleInstance), а затем сворачивает приложение, OnDestroy() вызывается для действия B, которое содержит работающую службу.
startForegroundService()
не связывает службу с конкретным действием, аstartForegroundService()
не препятствует работе обратной навигации. - person CommonsWare   schedule 17.12.2020ActivityA
запускаетActivityB
и наоборот? - person David Wasser   schedule 22.12.2020ActivityB
сlaunchMode=:"singleInstance"
, но не указалиtaskAffinity
. Это означает, что когдаActivityA
запускаетActivityB
, режим запуска игнорируется иActivityB
запускается в той же задаче, что иActivityA
. Это может быть или не быть тем, что вы хотели. Вы можете проверить это, запустивActivityB
изActivityA
, а затем используяadb shell dumpsys activity activities
, и вы должны увидеть только 1 задачу для своего приложения (а не 2). - person David Wasser   schedule 03.01.2021ActivityA
в качестве root иActivityB
поверх нее. КогдаActivityB
теперь запускаетActivityA
с помощью флаговCLEAR_TOP
иSINGLE_TOP
,ActivityB
удаляется из задачи (завершается), и пользователь возвращается к исходному экземпляруActivityA
. Вы также должны увидеть это с помощьюadb shell dumpsys activity activities
. ПосколькуActivityB
закончен, в какой-то момент на нем будет вызванonDestroy()
. Это также должно быть поведение до Android 11. - person David Wasser   schedule 03.01.2021adb shell
определите, есть ли у вас 1 задача или 2. Я не понимаю, как у вас может быть 2 задачи, посколькуtaskAffinity
переопределяетlaunchMode
, и оба действия имеют одинаковое значение. (по умолчанию)taskAffinity
. Пожалуйста, сообщите нам о своих выводах (вы можете отредактировать свой вопрос и добавить соответствующую информацию), и тогда я смогу внести другие предложения. - person David Wasser   schedule 03.01.2021taskAffinity
. Я не проверял это сам, но я уже ответил на этот вопрос, который похож на ваш: stackoverflow.com/questions/64769530/ Мне нужно провести еще несколько исследований, чтобы действительно понять, что изменилось . - person David Wasser   schedule 03.01.2021SpringBoardActivity
, которая является корнемActivity
задачи. - person David Wasser   schedule 07.01.2021