Android:为Intent设置setPackage后,仍需调用resolveActivity()检查吗?
API 19+指定默认应用包名后,是否还需要调用
resolveActivity()检查Intent? 在API 19(Android 4.4)及以上版本中,系统支持默认应用功能,我们可以通过Telephony.Sms.getDefaultSmsPackage()获取默认短信应用的包名。现在的疑问是:当我们通过setPackage()把Intent指定给这个默认应用后,还有必要调用resolveActivity(getPackageManager())做空值检查吗?这种检查属于冗余操作吗?
带检查的实现代码
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { String defaultSMSPackageName = Telephony.Sms.getDefaultSmsPackage(this); final Intent smsIntent = new Intent(Intent.ACTION_SENDTO); if (defaultSMSPackageName != null) { smsIntent.setPackage(defaultSMSPackageName); if (smsIntent.resolveActivity(getPackageManager()) != null) { startActivity(smsIntent); finish(); } } }
直接启动的实现代码
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { String defaultSMSPackageName = Telephony.Sms.getDefaultSmsPackage(this); final Intent smsIntent = new Intent(Intent.ACTION_SENDTO); if (defaultSMSPackageName != null) { smsIntent.setPackage(defaultSMSPackageName); startActivity(smsIntent); finish(); } }
结论:建议保留resolveActivity()检查,不算冗余
原因如下:
- 状态可能发生变化:
getDefaultSmsPackage()返回的是当前时刻的默认应用包名,但在你获取包名到调用startActivity()的这段时间里,用户可能卸载了该应用,或者应用因损坏无法正常响应Intent。 - 默认应用未必支持目标Action:部分定制ROM的默认短信应用,或者应用版本更新后,可能对
Intent.ACTION_SENDTO这个Action的支持有特殊限制,甚至移除了相关处理逻辑。 - 避免崩溃风险:如果跳过检查直接调用
startActivity(),一旦没有匹配的Activity,系统会抛出ActivityNotFoundException导致App崩溃。提前检查可以优雅处理这种情况,比如给用户弹出提示,或者切换到备用方案。
本质上,系统返回的默认应用包名只是一个状态快照,后续状态存在变数,加上检查属于稳妥的防御性编程,能有效规避潜在的崩溃问题。
内容的提问来源于stack exchange,提问作者AJW
相关产品推荐
相关产品推荐

