Android TV应用崩溃后重启及强制停止后启动方案咨询
企业级Android TV应用保活与重启实战方案
一、核心原则:别让重启逻辑和主进程绑死
把负责监控重启的服务和主App进程完全分开,这样主进程崩溃时,监控服务不会跟着挂,还能正常执行重启操作。
二、具体落地方法
1. 独立进程的前台监控服务
- 在
AndroidManifest.xml里给监控服务加android:process=":restart_monitor"属性,强制让它跑在单独进程里。 - 服务里定时扫一遍正在运行的进程,匹配主App的包名,判断主进程是否存活。
- 发现主进程没了,直接用
Intent启动主Activity,记得加FLAG_ACTIVITY_NEW_TASK标记。 - 必须把这个服务设为前台服务,给个低优先级的通知就行(TV端可以把通知设成低重要性,用户基本看不到),避免被系统后台查杀。
代码示例(Kotlin):
class RestartMonitorService : Service() { private val checkGap = 5000L // 每5秒查一次 private lateinit var checkTask: Job override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { // 启动前台服务,挂个低优先级通知 val notification = NotificationCompat.Builder(this, "monitor_channel") .setSmallIcon(R.drawable.ic_empty) .setContentTitle("应用监控中") .setPriority(NotificationCompat.PRIORITY_MIN) .build() startForeground(1001, notification) // 启动循环检测 checkTask = CoroutineScope(Dispatchers.IO).launch { while (isActive) { if (!isMainProcessAlive()) { fireUpMainApp() } delay(checkGap) } } return START_STICKY } private fun isMainProcessAlive(): Boolean { val am = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager val mainPkg = packageName.replace(":restart_monitor", "") return am.runningAppProcesses.any { it.processName == mainPkg } } private fun fireUpMainApp() { val launchIntent = packageManager.getLaunchIntentForPackage(packageName.replace(":restart_monitor", "")) launchIntent?.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) startActivity(launchIntent) } override fun onBind(intent: Intent): IBinder? = null override fun onDestroy() { checkTask.cancel() super.onDestroy() } }
2. 抓系统广播触发重启
- 监听
BOOT_COMPLETED(开机完成)、PACKAGE_REPLACED(应用更新后)这些系统广播,在广播接收器里启动主App或者监控服务。 - 注意:Android 8.0之后静态注册的广播大多失效,要么在前台服务里动态注册,要么用
JobScheduler配合广播触发。 - 还可以监听
ACTION_USER_PRESENT(用户解锁设备),确保用户操作后应用能自动恢复。
3. 拿系统权限绕限制
- 申请
RECEIVE_BOOT_COMPLETED权限,保证开机能自启。 - 引导用户把应用加进电池优化白名单,不然低电量时系统会直接杀后台。
- 部分定制TV系统还要开“后台运行权限”,或者申请
SYSTEM_ALERT_WINDOW权限,具体看厂商要求。
4. 强制停止后的重启办法
- 强制停止后,系统会封死应用所有自启路径,普通方法没用,只能靠这俩:
- 设备管理员权限:如果能拿到
DEVICE_ADMIN权限,设备管理员可以在应用被强停后触发重启(需要用户手动授权)。 - 独立守护APK:做个超轻量的小APK,和主App完全分离,专门监控主App状态,发现被强停就启动它。这个小APK要尽量精简,减少被系统查杀的概率。
- 设备管理员权限:如果能拿到
三、避坑提醒
- 检测间隔别设太短,3-10秒足够,太频繁会占资源。
- 别光想着保活,主App的崩溃日志一定要收集,从根源减少崩溃才是正道。
- 不同TV厂商的ROM限制不一样,比如小米、海信这些都有自己的后台管控,得针对性测试适配。
内容的提问来源于stack exchange,提问作者pehaada
相关产品推荐
相关产品推荐

