Android应用调用startActivity(intent)崩溃,无默认停止弹窗求排查
嘿,我来帮你拆解下这种情况的几个常见原因——毕竟没看到系统默认的崩溃提示,排查起来确实得换个思路:
全局异常处理器拦截了崩溃
很多应用会自定义Thread.UncaughtExceptionHandler来收集崩溃日志,或者集成了第三方崩溃分析SDK。这些工具会接管未捕获异常的处理逻辑,只记录日志但不触发系统的“App has stopped”弹窗。你可以检查代码里有没有调用Thread.setDefaultUncaughtExceptionHandler(),或者看看第三方SDK的配置是不是默认关闭了系统弹窗。Intent传递的数据存在问题且异常被吞
最常见的就是传递了不可序列化/Parcelable的对象,或者传递的数据量超过了Binder的传输上限(大概1MB),这时候会抛出NotSerializableException或者TransactionTooLargeException。如果这些异常被你的全局异常处理器捕获后没有重新抛出,系统就不会弹出崩溃提示。建议排查下Intent里putExtra的对象是否符合序列化要求,有没有传递大体积数据(比如Bitmap、超长字符串)。目标Activity未在Manifest中注册
正常来说,调用未注册的Activity会抛出ActivityNotFoundException,系统会弹窗提示,但如果这个异常被你的代码拦截处理了(比如只打印日志不向上抛出),就不会出现默认弹窗。赶紧检查下AndroidManifest.xml里有没有正确注册目标Activity,类名和包名有没有拼写错误。非UI线程调用startActivity的异常被拦截
startActivity必须在UI线程执行,如果在子线程调用会抛出AndroidRuntimeException,提示需要添加FLAG_ACTIVITY_NEW_TASK标记。如果这个异常被全局处理器吞掉,同样不会触发系统弹窗。你可以确认下调用startActivity的代码是不是在UI线程,或者有没有正确设置标记。系统或ROM的定制限制
部分定制ROM会修改应用崩溃的提示逻辑,或者用户在系统设置里关闭了应用崩溃弹窗。这种情况可以换个原生Android设备测试下,排除系统层面的影响。
内容的提问来源于stack exchange,提问作者Surendra Singh

