Android 8发送短信后自动关闭短信界面并返回应用的问题
解决Android 8发送短信后应用进入后台的问题
我太懂你的困扰了——之前的代码在旧版Android上都能乖乖返回自己的应用,结果到了Android 8就掉链子,发完短信直接把应用挤去后台。这其实是Android 8(API 26)新增的后台启动Activity限制搞的鬼,再加上你用的exit_on_sent根本不是官方标准的Intent参数,不同厂商的短信应用支持程度参差不齐,到Android 8后这个参数直接失效了。
下面给你两个靠谱的解决方案,根据你的项目情况选就行:
方案一:用传统的startActivityForResult(适合非AndroidX项目)
我们可以通过startActivityForResult启动短信界面,这样就能监听它关闭的回调,然后手动把自己的应用拉回前台:
// 定义一个专属请求码,用来识别短信请求的回调 private static final int SMS_SEND_REQUEST = 100; // 替换你原来的启动短信代码 Uri uri = Uri.parse("smsto:" + "074********; 074********"); Intent smsSIntent = new Intent(Intent.ACTION_SENDTO, uri); smsSIntent.putExtra("sms_body", "iconference sms"); // 改用startActivityForResult启动,而非直接startActivity startActivityForResult(smsSIntent, SMS_SEND_REQUEST);
然后重写onActivityResult方法,在短信界面关闭后触发前台操作:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 判断是不是我们的短信请求回调 if (requestCode == SMS_SEND_REQUEST) { // 调用方法把应用拉回前台 bringAppToForeground(); } } private void bringAppToForeground() { Intent intent = new Intent(this, YourMainActivity.class); // 替换成你的主Activity类 // 添加Flag确保启动的是当前任务栈的顶部Activity,不会新建重复实例 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); }
方案二:用AndroidX的registerForActivityResult(推荐,适合AndroidX项目)
如果你的项目已经迁移到AndroidX,推荐用更现代的registerForActivityResult,避免startActivityForResult被废弃的问题:
// 在Activity的onCreate方法里注册回调 ActivityResultLauncher<Intent> smsSendLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { // 不管用户是发送成功还是取消操作,都把应用拉回前台 bringAppToForeground(); } ); // 启动短信Intent的代码 Uri uri = Uri.parse("smsto:" + "074********; 074********"); Intent smsSIntent = new Intent(Intent.ACTION_SENDTO, uri); smsSIntent.putExtra("sms_body", "iconference sms"); smsSendLauncher.launch(smsSIntent);
同样需要实现bringAppToForeground方法,和方案一的代码完全一致:
private void bringAppToForeground() { Intent intent = new Intent(this, YourMainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); }
关键提醒
- Android 8的后台限制:系统不允许纯后台应用直接启动Activity,但我们的回调是从前台启动的短信界面返回的,属于前台任务栈的延续操作,完全符合系统规则,不会被拦截。
- 别再依赖
exit_on_sent:这个参数是第三方短信应用的自定义参数,没有官方标准,小米、华为、三星这些厂商的短信应用可能根本不支持,靠它实现返回逻辑太不靠谱了。
内容的提问来源于stack exchange,提问作者Jhon




