You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

前台运行高资源App时应用重启:如何确保onActivityResult可靠触发

解决方案:确保后台重启后仍能接收跨应用返回结果

你的问题核心是Android系统因内存不足回收后台应用后,原Activity的ActivityResultLauncher实例丢失,且返回时默认启动MainActivity导致结果无法传递。以下是针对性的解决方法:


1. 修正跨应用返回的目标Activity

另一应用返回时,不要仅通过通用deeplink跳转,需明确指定你的子Activity作为目标,避免系统默认启动MainActivity。调整另一应用的返回代码:

// 替换为你的应用包名和子Activity全类名
ComponentName targetComponent = new ComponentName("com.your.package", "com.your.package.YourSubActivity");
Intent resultIntent = new Intent();
resultIntent.setComponent(targetComponent);
resultIntent.putExtra("result", resultToSend);
setResult(Activity.RESULT_OK, resultIntent);
finish();

2. 确保子Activity重建时能接收结果

ActivityResultLauncher必须在onCreate()中注册,且系统会自动保存请求状态。当子Activity因进程重启重建时,新注册的Launcher会自动接收返回结果。同时可添加兜底逻辑,直接从重建后的Intent中读取结果:

private ActivityResultLauncher<Intent> myActivityResultLauncher;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sub);

    // 每次 onCreate 都注册 Launcher(包括重建场景)
    myActivityResultLauncher = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            result -> {
                if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) {
                    processResult(result.getData().getStringExtra("result"));
                }
            });

    // 兜底:如果重建时直接携带结果,直接处理
    if (getIntent() != null && getIntent().hasExtra("result")) {
        processResult(getIntent().getStringExtra("result"));
    }

    btnProcess.setOnClickListener(v -> {
        String deeplinkUrl = "<deep link URL>";
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(deeplinkUrl));
        myActivityResultLauncher.launch(intent);
    });
}

// 统一处理结果的逻辑
private void processResult(String result) {
    // 保存结果到本地或更新UI等操作
}

3. 用持久化存储做结果兜底(可选)

由于另一应用处理耗时长达20分钟,系统回收概率极高,可让另一应用将结果先写入持久化存储(如ContentProvider、本地文件),返回时仅传递结果标识。你的应用重启后,通过标识读取结果:

  • 另一应用侧:将结果写入自定义ContentProvider,返回时传递结果ID
  • 你的应用侧:在onCreate()中检查是否有待处理的结果ID,读取并处理

4. 降低后台被回收的概率

  • 避免子Activity持有大量内存对象,及时释放资源
  • 若业务允许,可在启动另一应用后启动一个前台服务(需显示通知),提升应用进程优先级,减少被系统回收的可能

内容的提问来源于stack exchange,提问作者Asanka Senavirathna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 13:43:09