如何检测从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的生命周期回调实现:
具体步骤:
- 新建或修改你的
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) {} }) } }
- 在
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
相关产品推荐
相关产品推荐

