Android Nougat(API24/25)应用被杀后启动Activity的解决方案
Android Nougat(API24/25)应用被杀状态下启动Activity的可行方案
针对API24/25的场景,以下是几种能在应用被杀后启动Activity的可行方案:
利用AlarmManager触发Service启动Activity
通过AlarmManager设置精确闹钟唤醒Service,再在Service中启动Activity,属于系统触发的场景,可绕过后台启动限制:- 设置触发Service的精确闹钟:
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager val intent = Intent(this, BootStartService::class.java) val pendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) // 根据API版本选择精确闹钟API if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, pendingIntent) } else { alarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, pendingIntent) } - 在Service的
onStartCommand中启动Activity:override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { val activityIntent = Intent(this, MainActivity::class.java) activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) startActivity(activityIntent) return START_NOT_STICKY }
注意:低电量模式下系统可能延迟触发闹钟,需结合业务场景评估。
- 设置触发Service的精确闹钟:
借助AccessibilityService辅助功能
AccessibilityService是系统级服务,用户授予权限后,即使应用进程被杀也会持续运行,可在服务中主动或监听系统事件启动Activity:- 实现AccessibilityService子类:
class MyAccessibilityService : AccessibilityService() { override fun onAccessibilityEvent(event: AccessibilityEvent?) { // 示例:监听屏幕点亮事件启动Activity if (event?.eventType == AccessibilityEvent.TYPE_SCREEN_ON) { val intent = Intent(this, MainActivity::class.java) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) startActivity(intent) } } override fun onInterrupt() {} } - 在AndroidManifest中注册服务并配置权限:
<service android:name=".MyAccessibilityService" 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> - 创建
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="typeScreenOn" android:accessibilityFeedbackType="feedbackGeneric" android:accessibilityFlags="flagDefault" android:canRetrieveWindowContent="true" />
注意:需引导用户到系统设置开启辅助功能权限,这是方案生效的前提。
- 实现AccessibilityService子类:
使用显式广播触发
API24中虽限制了部分隐式广播,但静态注册的显式广播仍可在应用被杀后被触发,进而启动Activity:- 在AndroidManifest中注册广播接收器:
<receiver android:name=".StartActivityReceiver"> <intent-filter> <action android:name="com.example.action.START_MAIN_ACTIVITY" /> </intent-filter> </receiver> - 实现广播接收器启动Activity:
class StartActivityReceiver : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { val activityIntent = Intent(context, MainActivity::class.java) activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) context?.startActivity(activityIntent) } } - 外部触发广播(如ADB命令、其他应用):
adb shell am broadcast -a com.example.action.START_MAIN_ACTIVITY -n com.example/.StartActivityReceiver
注意:应用自身无法在被杀后主动发送广播,需依赖外部触发源。
- 在AndroidManifest中注册广播接收器:
重要说明
即使在API24/25中,系统也会限制无合理场景的后台Activity启动请求,上述方案均依赖系统允许的触发条件,需结合实际业务场景选择适配。
内容的提问来源于stack exchange,提问作者Dilipchandar
相关产品推荐
相关产品推荐

