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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 23:54:41