You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动