android - 我需要什么配置,以避免 Android 11 在从我的主要任务最小化后杀死我的 SingleInstance Activity?

标签 android android-service foreground-service android-11

我目前的流程如下:

  1. 用户进入主 Activity A
  2. 然后用户启动 Activity B,它是单个实例
  3. Activity B 然后启动一个前台服务

启动前台服务的方法

public static void startService(Activity activity) {
    Intent serviceIntent = SomeService.newIntent(activity);
    ContextCompat.startForegroundService(activity, serviceIntent);
}

服务启动命令

Notification notification = getNotification();

startForeground(1, notification);

return START_NOT_STICKY;

list

<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 和之前的版本上保持 Activity 状态。

  1. 如果 Activity B 被最小化,前台服务将保持 Activity 状态。
  2. 如果用户从 Activity B (singleInstance) 启动 Activity A,则前台服务保持 Activity 状态。

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

Activiy B 启动 A:

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 版本不同,如果用户从 Activity B(singleInstance)启动 Activity A,然后最小化应用程序,OnDestroy() 将在 Activity B 上调用,该 Activity B 持有正在运行的服务。

最佳答案

我最初的目标是在 Activity B 中获取位置更新,同时我们的用户仍然可以使用该应用程序(打开其他 Activity )。保持 Activity B Activity 很重要,因为它有一个无法重新加载的 WebView,否则用户将失去他们的进度。

我能够通过 Activity B 上的单实例标志实现此目的,但可能不是正确的方法,因为很明显 Google 改变了新 Android 11 更新中管理任务的方式。

向 Activity B 添加不同的 taskAffinity 可以轻松解决我的任务被终止的问题,但它在最近的应用程序中创建了两个窗口,如果用户使用 Activity A 终止了窗口,则会导致其他问题。

我重新构建了我的解决方案,使我的服务成为一个绑定(bind)服务,也可以转到前台,并且它将包含我的 UI 在重新进入 Activity B 时需要的所有必要数据。 https://developer.android.com/guide/components/bound-services

关于android - 我需要什么配置,以避免 Android 11 在从我的主要任务最小化后杀死我的 SingleInstance Activity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65332528/

相关文章:

java - 如何在多个fragment之间共享MediaPlayer对象?

android - 什么是 Android 上的 Binder 回调?

android - 调用一个新的 onCreateInputView()

android - Android 上的 MP3 解码

安卓 : clickable Image horizontal slider using kotlin

android - 关于服务中的 START_STICKY

android - 仅在华为设备中关闭应用程序时服务被杀死

android - JobScheduler Android Oreo 问题

Android AlarmManager 在应用程序被终止时不会触发

android - 在关闭应用程序的情况下使用 'react-native-camera'