Android:如何检测被调用应用早期崩溃并返回结果?
跨App自动跳转时感知目标App早期崩溃的解决方案
问题背景
我们的场景是:App A在导航时会自动检测App B是否安装,若已安装则通过Intent跳转至App B的Activity替代自身功能。但遇到一个问题:如果App B在启动早期崩溃(如onCreate阶段),App A无法感知,会不断重复跳转;而App B在启动完成后崩溃时,系统会将App A拉回前台,且App A能收到RESULT_CANCELED的结果,此时不会重复跳转。
早期崩溃与后期崩溃的核心差异
- 后期崩溃:App B的Activity已完成启动流程(进入
onResume状态),此时崩溃会触发系统的任务栈回退逻辑,App A回到前台,且通过onActivityResult/Activity Result API收到RESULT_CANCELED,可以正常终止自动跳转逻辑。 - 早期崩溃:App B的Activity在启动流程中崩溃(如
onCreate、onStart阶段),系统尚未完成该Activity的任务栈入栈和前台切换,因此不会触发App A的结果回调,App A的自动跳转逻辑会再次执行,陷入循环。
可行解决方案
1. 目标App侧全局异常处理器主动通知
在App B中注册全局未捕获异常处理器,崩溃时主动向App A发送信号:
- 实现步骤:
- 在App B的
Application类中设置全局异常处理器:Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { // 发送崩溃信号给App A Intent intent = new Intent("com.example.appa.ACTION_APP_CRASH"); intent.setPackage("com.example.appa"); // 指定App A包名,避免广播泄露 sendBroadcast(intent); // 调用系统默认处理器,保证崩溃提示正常弹出 Thread.getDefaultUncaughtExceptionHandler().uncaughtException(thread, throwable); }); - App A注册广播接收器,接收崩溃信号后,通过SharedPreferences等存储标记,后续不再触发自动跳转。
- 在App B的
- 注意:需为广播添加自定义权限,防止第三方伪造信号;该方案能覆盖App B启动阶段的所有崩溃场景。
2. 发起App侧超时检测兜底
针对App B未做适配的情况,App A可通过超时判断启动失败:
- 实现步骤:
- App A跳转App B时,启动一个延迟任务:
private static final long LAUNCH_TIMEOUT = 3000; // 3秒超时 private Handler crashCheckHandler = new Handler(Looper.getMainLooper()); private Runnable timeoutRunnable = () -> { // 未收到启动成功信号,标记App B启动失败 SharedPreferences.Editor editor = getSharedPreferences("app_status", MODE_PRIVATE).edit(); editor.putBoolean("app_b_crashed", true); editor.apply(); }; // 跳转App B前启动超时任务 crashCheckHandler.postDelayed(timeoutRunnable, LAUNCH_TIMEOUT); - App B启动成功后(如
onResume中),向App A发送“启动成功”广播,App A收到后取消超时任务:crashCheckHandler.removeCallbacks(timeoutRunnable);
- App A跳转App B时,启动一个延迟任务:
- 优势:无需依赖App B的改造,兼容性强,可作为方案1的兜底。
3. 约定启动成功回调机制
要求App B在启动完成后,主动向App A发送“启动成功”信号,App A只有收到该信号,才允许后续的自动跳转;若超时未收到,则判定为启动失败。该方案可与方案2的超时逻辑结合,形成双重保障。
推荐方案组合
优先采用方案1+方案2的组合:
- 让App B通过全局异常处理器主动发送崩溃信号,保证精准感知;
- App A侧添加超时检测,兜底处理App B未适配或信号丢失的情况;
- 用SharedPreferences存储标记,后续导航时先检查标记,避免重复跳转。
内容的提问来源于stack exchange,提问作者arkascha
相关产品推荐
相关产品推荐

