Android 11(API 级别 30)onTaskRemoved 在应用程序转到后台时在前台服务中触发
Android 11 (API level 30) onTaskRemoved fired in Foreground service when app go to background
我尝试测试我在 android 11 上使用的应用程序(在 Pixel 3 XL 上安装)。当应用程序进入后台时,我收到奇怪的行为:
onTaskRemoved 在前台服务上触发,看起来应用已终止并重新启动。
关于前台服务的信息:
在清单中:
<service
android:name=".MyFS"
android:foregroundServiceType="mediaProjection"
android:enabled="true"
android:exported="false"/>
在 FS class onStartCommand -> return START_STICKY;
其他信息:应用使用“相机”和“麦克风”,我尝试将这两个添加到 android:foregroundServiceType="mediaProjection|camera|microphone",但没有帮助。
同样有趣的是,onTaskRemoved 仅在该应用程序第一次进入后台时触发,如果我返回应用程序并第二次单击“主页”,则不会调用 onTaskRemoved。
请帮我理解它是从哪里来的。谢谢
PS:
有关系吗?
在 onTaskRemoved 之前,我可以完整地看到 logcat 这个:
2020-10-05 09:33:19.866 1463-1524/? D/EventSequenceValidator: onIntentFailed during UNKNOWN.
java.lang.Throwable: EventSequenceValidator#getStackTrace
at com.google.android.startop.iorap.EventSequenceValidator.logWarningWithStackTrace(EventSequenceValidator.java:260)
at com.google.android.startop.iorap.EventSequenceValidator.onIntentFailed(EventSequenceValidator.java:130)
at com.android.server.wm.LaunchObserverRegistryImpl.handleOnIntentFailed(LaunchObserverRegistryImpl.java:147)
at com.android.server.wm.LaunchObserverRegistryImpl.lambda$KukKmVpn5W_1xSV6Dnp8wW2H2Ks(Unknown Source:0)
at com.android.server.wm.-$$Lambda$LaunchObserverRegistryImpl$KukKmVpn5W_1xSV6Dnp8wW2H2Ks.accept(Unknown Source:2)
at com.android.internal.util.function.pooled.PooledLambdaImpl.doInvoke(PooledLambdaImpl.java:264)
at com.android.internal.util.function.pooled.PooledLambdaImpl.invoke(PooledLambdaImpl.java:201)
at com.android.internal.util.function.pooled.OmniFunction.run(OmniFunction.java:97)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.os.HandlerThread.run(HandlerThread.java:67)
at com.android.server.ServiceThread.run(ServiceThread.java:44)
2020-10-05 09:33:19.866 1463-1524/? D/EventSequenceValidator: dec AccIntentStartedEvents to 2
2020-10-05 09:33:19.870 27662-27662/: t:main onTaskRemoved here.
对我来说,将 activity 启动模式从 singleInstance
更改为解决了问题并且不再调用 onTaskRemoved
。
我在清单中用 singleInstance
声明了 2 个活动。将它们更改为 singleTop
后,问题就消失了。
改变
android:launchMode="singleInstance"
到
android:launchMode="singleTop"
或完全删除它
显然,使用 singleInstance 是有正当理由的,这仍然是意外行为,但目前它是一个有效的解决方法。
我尝试测试我在 android 11 上使用的应用程序(在 Pixel 3 XL 上安装)。当应用程序进入后台时,我收到奇怪的行为: onTaskRemoved 在前台服务上触发,看起来应用已终止并重新启动。
关于前台服务的信息: 在清单中:
<service
android:name=".MyFS"
android:foregroundServiceType="mediaProjection"
android:enabled="true"
android:exported="false"/>
在 FS class onStartCommand -> return START_STICKY;
其他信息:应用使用“相机”和“麦克风”,我尝试将这两个添加到 android:foregroundServiceType="mediaProjection|camera|microphone",但没有帮助。
同样有趣的是,onTaskRemoved 仅在该应用程序第一次进入后台时触发,如果我返回应用程序并第二次单击“主页”,则不会调用 onTaskRemoved。
请帮我理解它是从哪里来的。谢谢
PS: 有关系吗? 在 onTaskRemoved 之前,我可以完整地看到 logcat 这个:
2020-10-05 09:33:19.866 1463-1524/? D/EventSequenceValidator: onIntentFailed during UNKNOWN.
java.lang.Throwable: EventSequenceValidator#getStackTrace
at com.google.android.startop.iorap.EventSequenceValidator.logWarningWithStackTrace(EventSequenceValidator.java:260)
at com.google.android.startop.iorap.EventSequenceValidator.onIntentFailed(EventSequenceValidator.java:130)
at com.android.server.wm.LaunchObserverRegistryImpl.handleOnIntentFailed(LaunchObserverRegistryImpl.java:147)
at com.android.server.wm.LaunchObserverRegistryImpl.lambda$KukKmVpn5W_1xSV6Dnp8wW2H2Ks(Unknown Source:0)
at com.android.server.wm.-$$Lambda$LaunchObserverRegistryImpl$KukKmVpn5W_1xSV6Dnp8wW2H2Ks.accept(Unknown Source:2)
at com.android.internal.util.function.pooled.PooledLambdaImpl.doInvoke(PooledLambdaImpl.java:264)
at com.android.internal.util.function.pooled.PooledLambdaImpl.invoke(PooledLambdaImpl.java:201)
at com.android.internal.util.function.pooled.OmniFunction.run(OmniFunction.java:97)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.os.HandlerThread.run(HandlerThread.java:67)
at com.android.server.ServiceThread.run(ServiceThread.java:44)
2020-10-05 09:33:19.866 1463-1524/? D/EventSequenceValidator: dec AccIntentStartedEvents to 2
2020-10-05 09:33:19.870 27662-27662/: t:main onTaskRemoved here.
对我来说,将 activity 启动模式从 singleInstance
更改为解决了问题并且不再调用 onTaskRemoved
。
我在清单中用 singleInstance
声明了 2 个活动。将它们更改为 singleTop
后,问题就消失了。
改变
android:launchMode="singleInstance"
到
android:launchMode="singleTop"
或完全删除它
显然,使用 singleInstance 是有正当理由的,这仍然是意外行为,但目前它是一个有效的解决方法。