安卓13允许app启动服务 android13允许应用启动服务 无法启动服务 Background start not allowed: service

在这里插入图片描述
总纲

android13 rom 开发总纲说明

1.前言

  android13应用启动服务,有些应用会被禁止启动服务,开启的服务会失败,这是高版本的android的特性,我们需要更改下frameworks的代码。

2.问题分析

查看下logcat信息

Background start not allowed: service

查找对应的代码,进行修改

3.代码分析

查找相关的代码,可以发现在下面过滤了,将其修改就可以了

diff --git a/frameworks/base/services/core/java/com/android/server/am/ActiveServices.java b/frameworks/base/services/core/java/com/android/server/am/ActiveServices.java
index c36e
### Android 后台启动服务或活动的限制与解决方案 在现代 Android 系统中,为了优化用户体验并减少不必要的资源消耗,Google 对后台应用的行为进行了严格的限制。这包括但不限于后台启动 `Service` 或 `Activity` 的能力。 #### 背景介绍 自 Android Oreo (8.0) 开始,系统引入了针对后台行为的新限制[^1]。如果应用程序位于后台,则尝试通过隐式或显式的意图来启动 `Service` 将会失败,并抛出错误消息:“Not allowed to start service Intent { ... }: app is in background”。这种机制旨在防止恶意软件滥用后台进程执行耗电操作。 对于 `Activity` 来说,在 Android 10 和更高版本上也存在类似的约束条件[^5]。具体而言,除非满足某些特定例外情况,否则处于后台的应用程序无法直接调用 `startActivity()` 方法触发前台界面切换。此逻辑由 AOSP 中的核心组件框架文件定义——即 `ActivityStarter.java` 类下的 `shouldAbortBackgroundActivityStart` 函数负责判断是否允许此类请求继续处理[^2]。 #### 技术细节解析 以下是几个重要概念及其关联: 1. **Binder权限检查** 当前进程中发起的服务绑定或者激活命令会被传递给目标端点之前先经历一轮安全验证流程。如果检测到当前上下文属于非活跃状态(即被标记为“background”),则整个过程将立即终止[^3]。 2. **Bind vs Start Services** 需要注意的是虽然两者都用于创建长期运行的任务单元,但是它们之间仍然存在一定差异。例如采用 bind 方式连接时不会受到上述规则的影响;而单纯依靠 start 则容易触碰到红线从而遭到拦截[^4]。 3. **豁免情形列举** - 接收到高优先级广播通知后的短暂时限期内; - 用户交互期间产生的事件链反应; - 设定闹钟唤醒计划表之后按照预定时刻自动唤起对应模块工作等等... 以上几种场景均有可能获得额外许可绕过常规审查环节进而顺利完成既定动作。 #### 实现建议 尽管官方强烈反对任何形式未经许可擅自打扰用户的举动,但在实际开发过程中确实存在着一些合法合理的应用场景需要突破这些屏障。下面给出几条可行路径供参考选用: - #### 使用 Foreground Service 如果确实有必要维持某个持续性的功能运作(比如播放音乐),那么可以通过注册前景服务的方式规避掉大部分障碍。只需记得设置恰当的通知图标即可让用户随时知晓目前正在进行的操作内容. ```java Intent intent = new Intent(this, MyForegroundService.class); ContextCompat.startForegroundService(this,intent); ``` - #### WorkManager API 定期重复型任务推荐利用 Google 提供的标准库工具完成调度安排。它内部已经妥善考虑到了兼容性和效率问题,能够有效应对各种复杂环境变化带来的挑战. ```kotlin val workRequest = PeriodicWorkRequestBuilder<MyWorker>(15, TimeUnit.MINUTES).build() WorkManager.getInstance(context).enqueue(workRequest) ``` - #### PendingIntent 结合 AlarmManager 这种组合特别适合用来预约未来某刻精确发生的事情。即使设备进入休眠模式也能可靠保障按时生效. ```java PendingIntent pendingIntent; AlarmManager alarmMgr; alarmMgr = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(this, ReceiverClass.class); pendingIntent = PendingIntent.getBroadcast(this, 0, intent, flags); // Set the alarm to start at approximately 2:00 p.m. Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY, 14); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ alarmMgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); } else { alarmMgr.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值