相关文章推荐
活泼的硬盘  ·  中注协就《企业内部控制审计指引实施意见》答问·  4 月前    · 
跑龙套的大熊猫  ·  人物访谈孔杰:以赛为媒演绎围棋精彩_手机新浪网·  1 年前    · 
私奔的毛巾  ·  “刘三姐歌谣”传承人谢庆良荣获“2022年国 ...·  1 年前    · 
鼻子大的煎饼果子  ·  辽芭史诗交响芭蕾《斯巴达克》即将震撼上演_文 ...·  1 年前    · 
想表白的水桶  ·  中国各民族文字类型·  1 年前    · 
小百科  ›  恶名昭彰的Android12:异常: startForegroundService()由于mAllowStartForeground false而不原则上-腾讯云开发者社区-腾讯云
context
强健的硬币
1 年前
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
提问
问 致命的Android12:异常: startForegroundService()由于mAllowStartForeground false而不允许
Stack Overflow用户
提问于 2021-11-20 08:36:36
EN

我注意到Pixel 5和Pixel 4a (都在Android 12上)有一个例外(Firebase Crashlytics),没有其他设备,只发生过两次,每台设备一次。

什么意思?Android 11和12在处理前台服务方面有相同的规则,但是Android 11没有问题。这是Pixel的错误吗?

来自火基破碎机:

Fatal Exception: android.app.ForegroundServiceStartNotAllowedException
startForegroundService() not allowed due to mAllowStartForeground false: service com.*.*/.service.RecorderService
android.app.ForegroundServiceStartNotAllowedException$1.createFromParcel (ForegroundServiceStartNotAllowedException.java:54)
androidx.core.content.ContextCompat.startForegroundService (ContextCompat.java:6)
MyAppPackageHidden.service.RecorderService$Companion.startService (RecorderService.java:2)
MyAppPackageHidden.ui.rec.RecActivity$getConnectionRecorderService$1.onServiceConnected (RecActivity.java:4)
android.app.LoadedApk$ServiceDispatcher.doConnected (LoadedApk.java:2077)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1003)
Fatal Exception: android.app.ForegroundServiceStartNotAllowedException: startForegroundService() not allowed due to mAllowStartForeground false: service MyAppPackageHidden/.service.RecorderService
       at android.app.ForegroundServiceStartNotAllowedException$1.createFromParcel(ForegroundServiceStartNotAllowedException.java:54)
       at android.app.ForegroundServiceStartNotAllowedException$1.createFromParcel(ForegroundServiceStartNotAllowedException.java:50)
       at android.os.Parcel.readParcelable(Parcel.java:3333)
       at android.os.Parcel.createExceptionOrNull(Parcel.java:2420)
       at android.os.Parcel.createException(Parcel.java:2409)
       at android.os.Parcel.readException(Parcel.java:2392)
       at android.os.Parcel.readException(Parcel.java:2334)
       at android.app.IActivityManager$Stub$Proxy.startService(IActivityManager.java:5971)
       at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1847)
       at android.app.ContextImpl.startForegroundService(ContextImpl.java:1823)
       at android.content.ContextWrapper.startForegroundService(ContextWrapper.java:779)
       at androidx.core.content.ContextCompat$Api26Impl.startForegroundService(ContextCompat.java)
       at androidx.core.content.ContextCompat.startForegroundService(ContextCompat.java:6)
       at MyAppPackageHidden.service.RecorderService$Companion.startService(RecorderService.java:2)
       at MyAppPackageHidden.ui.rec.RecActivity$getConnectionRecorderService$1.onServiceConnected(RecActivity.java:4)
       at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:2077)
       at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:2110)
       at android.os.Handler.handleCallback(Handler.java:938)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loopOnce(Looper.java:201)
       at android.os.Looper.loop(Looper.java:288)
       at android.app.ActivityThread.main(ActivityThread.java:7838)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
Caused by android.os.RemoteException: Remote stack trace:
    at com.android.server.am.ActiveServices.startServiceLocked(ActiveServices.java:691)
    at com.android.server.am.ActiveServices.startServiceLocked(ActiveServices.java:616)
    at com.android.server.am.ActivityManagerService.startService(ActivityManagerService.java:11839)
    at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:2519)
    at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2498)

​

​

5 19.5K 0 票数 39
EN
android
android-service
android-12

回答 5

Stack Overflow用户

回答已采纳

发布于 2022-01-11 12:43:05

针对Android 12 (API级别31)或更高的应用程序在后台运行时不能启动前台服务,只有少数特殊情况除外。如果应用程序在后台运行时尝试启动前台服务,而前台服务不满足其中一种例外情况,系统将抛出一个ForegroundServiceStartNotAllowedException。

对背景启动限制的豁免

在以下情况下,即使应用程序在后台运行,应用程序也可以启动前台服务:

  • 您的应用程序从用户可见状态(如活动)过渡。
  • 您的应用程序可以从后台启动一个活动,除了应用程序在现有任务的后台堆栈中有一个活动的情况。
  • 您的应用程序使用Firebase消息接收高优先级消息。
  • 用户对与应用程序相关的UI元素执行操作。例如,它们可能与气泡、通知、小部件或活动交互。
  • 您的应用程序调用一个精确的警报来完成用户请求的操作。
  • 您的应用程序是设备当前的输入方法。
  • 您的应用程序接收到与地理位置或活动识别转换相关的事件。
  • 在设备重新启动并接收广播接收器中的ACTION_BOOT_COMPLETED、ACTION_LOCKED_BOOT_COMPLETED或ACTION_MY_PACKAGE_REPLACED意图操作后。

有关更多信息,请访问 link1 link2 。

票数 20
EN

Stack Overflow用户

发布于 2022-05-05 17:35:07

以前,我们使用 Service 运行后台任务,如数据备份、设置提醒通知等。调用服务的代码如下所示

Intent serviceIntent = new Intent ( context, BackupService.class );
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    context.startForegroundService ( serviceIntent );
} else {
    context.startService ( serviceIntent );
}

但是,由于 Android 12 - Foreground service launch restrictions ,我们将无法调用服务来执行后台任务。要了解有关此限制的更多信息,请参考 Android 12行为改变 。

因此,从现在开始,(即)从targetSdk 31 / Android 12+开始,只有在应用程序处于前台时才能调用 Service 。当应用程序关闭或应用程序转到后台时,使用 Service 调用 startForegroundService 将导致 ForegroundServiceStartNotAllowedException 。因此,要在Android12和更高版本中执行后台任务,我们需要使用 Worker 而不是 Service 。要了解更多关于 Worker 的信息,请参考 工作要求 。

因此,对于针对SDK 31 / Android 12+的应用程序,调用后台任务的代码如下所示:

Intent serviceIntent = new Intent ( context, BackupService.class );
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    OneTimeWorkRequest request = new OneTimeWorkRequest.Builder ( BackupWorker.class ).addTag ( "BACKUP_WORKER_TAG" ).build ();
    WorkManager.getInstance ( context ).enqueue ( request );
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    context.startForegroundService ( serviceIntent );
} else {
    context.startService ( serviceIntent );
}

BackupService 的示例代码(现有的)。

public class BackupService extends Service {
    private static final String TAG = "BackupService";
    @Nullable
    @Override
    public IBinder onBind ( Intent intent ) {
        return null;
    @Override
    public int onStartCommand ( Intent intent, int flags, int startId ) {
        Log.d ( TAG, "onStartCommand" );
        startForeground ( BACKUP_SERVICE_NOTIFICATION_ID, createServiceNotification () );
        //call methods to perform background task
        return super.onStartCommand ( intent, flags, startId );
}

BackupWorker 的示例代码(新添加的)。

public class BackupWorker extends Worker {
    private static final String TAG = "BackupWorker";
    public BackupWorker ( @NonNull Context context, @NonNull WorkerParameters workerParams ) {
        super ( context, workerParams );
    @NonNull
    @Override
 
推荐文章
活泼的硬盘  ·  中注协就《企业内部控制审计指引实施意见》答问
4 月前
跑龙套的大熊猫  ·  人物访谈孔杰:以赛为媒演绎围棋精彩_手机新浪网
1 年前
私奔的毛巾  ·  “刘三姐歌谣”传承人谢庆良荣获“2022年国家级非遗代表性传承人薪传 ...
1 年前
鼻子大的煎饼果子  ·  辽芭史诗交响芭蕾《斯巴达克》即将震撼上演_文化快报_首都之窗_ ...
1 年前
想表白的水桶  ·  中国各民族文字类型
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   藏经阁   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
小百科 - 百科知识指南
© 2024 ~ 沪ICP备11025650号