You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android13(MIUI14)应用未运行时,BroadcastReceiver无法启动前台服务

问题与解决方案:Android13(MIUI14)下应用未运行时监听解锁事件启动前台服务

问题概述

在Android 13(MIUI 14)系统中,应用未处于运行状态时,无法通过静态注册的BroadcastReceiver接收USER_PRESENT和USER_UNLOCKED意图启动前台服务;但应用运行时该功能可正常工作。目前已实现应用未运行时接收BOOT_COMPLETED意图并启动服务,实现方式是引导用户开启MIUI自启动权限。

核心原因

  1. Android系统后台限制:从Android 12开始,系统对隐式广播的接收做了严格限制,应用未运行时,静态注册的USER_PRESENT这类广播会被系统拦截,无法触发接收器。
  2. MIUI额外管控:MIUI在系统限制基础上增加了自启动、后台启动的额外校验,即使开启了自启动权限,非系统级的隐式广播依然无法唤醒未运行的应用。

解决方案

方案一:使用AccessibilityService监听解锁事件

辅助服务(AccessibilityService)可以不受应用运行状态限制,持续监听系统界面事件,适合用来捕捉解锁行为。

1. 创建辅助服务类

class UnlockMonitorService : AccessibilityService() {
    override fun onAccessibilityEvent(event: AccessibilityEvent) {
        // 监听窗口状态变化事件,判断是否为解锁后回到系统界面/桌面
        if (event.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
            val packageName = event.packageName?.toString()
            // 匹配MIUI桌面或系统核心包,判定为解锁完成
            if (packageName == "com.miui.home" || packageName == "android") {
                // 启动前台服务
                MyService.start(this)
            }
        }
    }

    override fun onInterrupt() {}

    override fun onServiceConnected() {
        super.onServiceConnected()
        // 配置服务监听的事件类型
        val serviceInfo = AccessibilityServiceInfo().apply {
            eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
            feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC
            flags = AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS
        }
        setServiceInfo(serviceInfo)
    }
}

2. 在Manifest中注册辅助服务

<service
    android:name=".UnlockMonitorService"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>
    <meta-data
        android:name="android.accessibilityservice"
        android:resource="@xml/accessibility_service_config" />
</service>

3. 创建辅助服务配置文件

在res/xml目录下新建accessibility_service_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeWindowStateChanged"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:accessibilityFlags="flagIncludeNotImportantViews"
    android:description="@string/accessibility_service_desc" />

在strings.xml中添加服务描述:

<string name="accessibility_service_desc">用于监听设备解锁状态,启动后台服务</string>

4. 引导用户开启辅助服务

在主Activity中添加权限引导逻辑:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // 检查辅助服务是否开启
    if (!isAccessibilityServiceEnabled(this, UnlockMonitorService::class.java)) {
        startActivity(Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS))
    }
    // 原有自启动权限引导逻辑保留
    ...
}

// 辅助方法:判断指定辅助服务是否已开启
private fun isAccessibilityServiceEnabled(context: Context, serviceClass: Class<*>): Boolean {
    val am = context.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager
    val enabledServices = am.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_GENERIC)
    for (serviceInfo in enabledServices) {
        val componentName = serviceInfo.resolveInfo.serviceInfo.componentName
        if (componentName.className == serviceClass.name) {
            return true
        }
    }
    return false
}

方案二:补充MIUI必要权限

除了自启动权限,还需要引导用户开启后台弹出界面权限,确保服务能在后台正常启动:

// 检查后台弹出权限(Android 11+)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    if (!Settings.canDrawOverlays(this)) {
        val intent = Intent(
            Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
            Uri.parse("package:${packageName}")
        )
        startActivity(intent)
    }
}

关键注意事项

  • 前台服务必须严格遵循Android 8.0+规范,启动时调用startForeground()并显示通知,否则会被系统强制杀死。
  • 辅助服务需要用户手动开启,必须在界面上明确告知用户服务的用途,避免被用户误认为是恶意功能。
  • MIUI下需同时开启自启动权限、后台弹出权限、辅助服务权限,才能保证功能稳定运行。

内容的提问来源于stack exchange,提问作者Fab1can

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 08:34:51