在某些设备上不会触发 ActivityResultCallback 函数 onActivityResult (Android Studio / Java)

ActivityResultCallback function onActivityResult won't be triggered on some devices (Android Studio / Java)

我有一个可以打开新 activity 的片段。从这个 activity,一旦按下保存或后退按钮,activity 中的数据将被检索并发送回片段。这至少是我期望发生的事情。在无法按预期工作的设备上,新的 activity 会启动,但是当返回片段时,不会调用从 ActivityResultCallback 接收数据的函数 onActivityResult。此外,返回时显示的片段不是正确的片段。这让我认为片段所在的 activity 没有正确保存并且正在显示 default/first 片段。这不是应用程序中的错误,因此没有任何错误消息。

起初我使用片段 class 中已弃用的 onActivityResult,并尝试将其更改为使用 ActivityResultCallback 中的 onActivityResult 方法的较新方法。但是问题仍然存在,所以我怀疑这是由于 API 版本引起的问题。这些是我测试过的设备,哪些设备的表现符合我的预期

Phone How it ran
Pixel - API 28 - Emulator As expected
Pixel 2 - API 29 - Emulator As expected
Moto x4 - API 28 - Real As expected
Moto g7 Power - API 29 - Real Not As expected

我已经检查了 google 的 ActivityResultLauncher 文档,但我无法理解我做错了什么。

这里是我的代码片段,适用于这个问题。

我有一个名为 Intent 的 class,我在这个项目中使用它类似于 android.content.Intent 名称。在这些片段中,我在引用 android.content.IntentIntent 时使用 android.content.Intent 来表示我的 Intent class.

PlanFragment.java

public class PlanFragment extends Fragment {       
    ...    
    ActivityResultLauncher<android.content.Intent> mStartForResult = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            new ActivityResultCallback<ActivityResult>() {
                @Override
                public void onActivityResult(ActivityResult result) {
                    Log.d("Cursor", "OnActivityResult");
                    if (result.getResultCode() == Activity.RESULT_OK) {
                        Log.d("Cursor", "OnActivityResultOk");
                    }
                }
            });
    ...
    public View onCreateView(...) {
        ...
        FloatingActionButton addIntent = view.findViewById(R.id.add_intent);
    addIntent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                android.content.Intent intent = new android.content.Intent(view.getContext(), AddEditIntentActivity.class);
                mStartForResult.launch(intent);
            }
        });
        ...
    }
    ...
}

AddEditIntentActivity.java

public class AddEditIntentActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {      
    ...    
    private void saveIntent() {
        Intent data = new Intent();
        data.putExtra(EXTRA_NAME, name);
        data.putExtra(EXTRA_DESC, desc);
        data.putExtra(EXTRA_IMAGE, image.trim());
        data.putExtra(EXTRA_TIME, time);

        int id = getIntent().getIntExtra(EXTRA_ID, -1);
        if (id != -1) {
            data.putExtra(EXTRA_ID, id);
        }

        Log.d("Cursor", "SaveIntent");
        setResult(Activity.RESULT_OK, data);
        Log.d("Cursor", "SetResult");
        onBackPressed();
        Log.d("Cursor", "backPressed");
    }
    ...
}

我尝试用 finish() 替换 onBackPressed(),但这也无济于事。

唯一出现的日志消息是 SaveIntentSetResultbackPressedOnActivityResultOnActivityResultOk 只出现在它工作的设备上。

谁能帮我确定为什么会出现这个问题,我该如何解决?

使用日志消息我意识到 activity/fragments 每次都在重新创建。然后我想检查我的开发者选项,看看是否开启了“不保留活动”。事实证明是的。切换后,它又开始工作了!