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

Posted

技术标签:

【中文标题】ActivityResultCallback 函数 onActivityResult 不会在某些设备上触发(Android Studio / Java)【英文标题】:ActivityResultCallback function onActivityResult won't be triggered on some devices (Android Studio / Java) 【发布时间】:2021-10-18 03:13:38 【问题描述】:

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

起初我使用片段类中已弃用的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 文档,但无法理解我做错了什么。

这是适用于这个问题的我的代码的 sn-ps。

我有一个名为Intent 的类,我在这个项目中使用过它,它类似于android.content.Intent 的名称。在这些 sn-ps 中,当我为我的 Intent 类引用 android.content.IntentIntent 时,我使用了 android.content.Intent

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");
    
    ...

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

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

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

【问题讨论】:

如果您返回的片段不是正确的片段,那么这听起来像是您的第一个活动的问题,而不是活动结果 API 的问题。你的第一个活动是做什么的? 如果您指的是片段打开的活动,那么,该活动允许您在屏幕上编辑一些参数(editText、Spinner 等)。按下保存按钮后,将创建一个 android.content.Intent 并将其与屏幕上的选定值一起传回。 不,first 活动 - 您将结果返回到的活动。 哦,好的。底部导航栏包含三个选项卡。显示的片段是第一个选项卡,但在底部导航栏中,中间选项卡显示为选中(突出显示)。中间选项卡是我希望活动返回的位置。中间选项卡显示了我的 Intent 对象的回收器视图列表。第一个选项卡本身具有三个选项卡视图(屏幕顶部),每个选项卡都显示了 Intent 对象选择的回收器视图列表。 因为我在一个片段中,所以我在片段类中的 onCreateView 中添加了所有代码。然后,一切都完成后,我返回了视图。是否会因为 onClickListener 在我返回视图之前启动新活动而发生此问题? 【参考方案1】:

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

【讨论】:

以上是关于ActivityResultCallback 函数 onActivityResult 不会在某些设备上触发(Android Studio / Java)的主要内容,如果未能解决你的问题,请参考以下文章

损失函数(损失函数代价函数目标函数)​​​​​​​MSE0-1损失函数绝对误差损失函数分位数损失函数Huber损失函数感知损失函数Hinge损失函数指数损失函数对数损失函数

Kotlin函数 ⑧ ( 函数引用 作为函数参数 | ::函数名 | 函数类型 作为函数返回值类型 )

测开之函数进阶篇・第五篇《递归函数纯函数匿名函数偏函数》

8InfluxDB常用函数聚合函数,count()函数,DISTINCT()函数,MEAN()函数,MEDIAN()函数,SPREAD()函数,SUM()函数

Kotlin函数式编程 ② ( 过滤函数 | predicate 谓词函数 | filter 过滤函数 | 合并函数 | zip 函数 | folder 函数 | 函数式编程意义 )

Kotlin函数式编程 ② ( 过滤函数 | predicate 谓词函数 | filter 过滤函数 | 合并函数 | zip 函数 | folder 函数 | 函数式编程意义 )