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

如何检测从Android应用启动的第三方应用是否已关闭/退出

检测第三方应用退出状态的实现方案(适配你的门禁来电场景)

Hey there! 针对你这个门禁来电后启动第三方应用、需要检测其是否关闭的需求,我整理了几个靠谱的实现思路,完全适配你现有的Android应用架构:

方法1:使用ActivityResultContracts.StartActivityForResult(推荐,适配Android 11+)

因为你是从RingCall活动启动第三方应用,用这个官方推荐的API可以直接监听返回结果,当第三方应用退出时,RingCall会立刻收到回调。

具体步骤:

  • 在你的RingCall类中,先注册一个ActivityResultLauncher:
private val startThirdPartyApp = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    // 不管第三方应用是正常退出还是被强制关闭,这里都会触发
    if (result.resultCode == Activity.RESULT_OK || result.resultCode == Activity.RESULT_CANCELED) {
        // 在这里处理第三方应用关闭后的逻辑,比如回到来电界面、记录日志等
        Log.d("RingCall", "第三方应用已退出")
    }
}
  • 点击"Accept"按钮时,用这个Launcher启动第三方应用(替换成目标应用的包名):
acceptButton.setOnClickListener {
    val thirdPartyPackage = "com.thirdparty.target.app" // 替换为第三方应用的实际包名
    val launchIntent = packageManager.getLaunchIntentForPackage(thirdPartyPackage)
    
    launchIntent?.let {
        startThirdPartyApp.launch(it)
    } ?: run {
        // 处理第三方应用未安装的情况
        Toast.makeText(this, "目标应用未安装", Toast.LENGTH_SHORT).show()
    }
}

方法2:全局监听Activity生命周期(适合多页面第三方应用)

如果第三方应用会启动多个页面,你需要更全局的监听,可以通过Application的生命周期回调实现:

具体步骤:

  1. 新建或修改你的Application类(记得在Manifest中配置):
class MyApp : Application() {
    private val targetPackage = "com.thirdparty.target.app"
    private var isThirdPartyActive = false

    override fun onCreate() {
        super.onCreate()
        registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
            override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
                if (activity.packageName == targetPackage) {
                    isThirdPartyActive = true
                }
            }

            override fun onActivityDestroyed(activity: Activity) {
                if (activity.packageName == targetPackage) {
                    isThirdPartyActive = false
                    // 通过广播通知RingCall应用已关闭
                    sendBroadcast(Intent("com.your.app.action.THIRD_PARTY_CLOSED"))
                }
            }

            // 其他生命周期方法留空即可
            override fun onActivityStarted(activity: Activity) {}
            override fun onActivityResumed(activity: Activity) {}
            override fun onActivityPaused(activity: Activity) {}
            override fun onActivityStopped(activity: Activity) {}
            override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
        })
    }
}
  1. 在RingCall中注册广播接收器,监听关闭通知:
private val closeReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        if (intent?.action == "com.your.app.action.THIRD_PARTY_CLOSED") {
            Log.d("RingCall", "第三方应用已完全退出")
            // 执行后续逻辑
        }
    }
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // 注册接收器
    registerReceiver(closeReceiver, IntentFilter("com.your.app.action.THIRD_PARTY_CLOSED"))
}

override fun onDestroy() {
    super.onDestroy()
    // 记得注销接收器,避免内存泄漏
    unregisterReceiver(closeReceiver)
}

方法3:定时检测进程状态(备选方案,不推荐)

如果上面两种方法不适用,可以定时检查第三方应用的进程是否存活,但这种方法耗电且不够实时,仅作为备选:

private fun checkThirdPartyStatus() {
    val targetPackage = "com.thirdparty.target.app"
    val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
    val runningProcesses = activityManager.runningAppProcesses
    
    val isRunning = runningProcesses.any { it.processName == targetPackage }
    if (!isRunning) {
        Log.d("RingCall", "第三方应用已退出")
        // 处理逻辑
    }
}

// 用Handler定时检测,比如每3秒一次
private val handler = Handler(Looper.getMainLooper())
private val checkRunnable = object : Runnable {
    override fun run() {
        checkThirdPartyStatus()
        handler.postDelayed(this, 3000)
    }
}

// 启动第三方应用后开始检测
acceptButton.setOnClickListener {
    // 启动应用代码...
    handler.post(checkRunnable)
}

// 页面销毁时停止检测
override fun onDestroy() {
    super.onDestroy()
    handler.removeCallbacks(checkRunnable)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:05:42