部分Android设备中ActivityResultCallback的onActivityResult无法触发求助
问题根因定位
1. 首要原因:宿主Activity被系统回收重建,Fragment栈未正确恢复
出现问题的Moto g7 Power设备可用内存偏小,或系统后台销毁策略更激进,打开AddEditIntentActivity后前台资源不足,系统直接销毁了承载PlanFragment的宿主Activity。
如果你的宿主Activity在onCreate方法中没有判断savedInstanceState是否为null,就直接执行Fragment添加/切换逻辑加载默认首个Fragment,就会导致:
- 原有Fragment栈被清空,之前的PlanFragment实例被销毁,自然收不到onActivityResult回调
- 返回后直接显示默认首个Fragment,和你描述的现象完全匹配
模拟器通常分配的内存较大,不会轻易销毁后台Activity,所以模拟器上运行全部正常,小内存真机就会触发异常。
2. 次要问题:setResult传递的Intent类型错误
你在AddEditIntentActivity的saveIntent方法中,初始化的是自定义的Intent类,而setResult方法要求传入的是系统android.content.Intent类型:
// 你当前的错误代码,这里的Intent是自定义类,不符合系统方法的参数要求 Intent data = new Intent(); setResult(Activity.RESULT_OK, data);
即使你的自定义Intent继承了系统Intent,跨组件传递时也可能出现序列化异常、系统识别失败的问题,导致结果无法正常回传。
解决方案
第一步:修复宿主Activity的Fragment初始化逻辑
找到承载PlanFragment的Activity的onCreate方法,修改Fragment加载逻辑,只有首次创建(savedInstanceState为null)时才添加默认Fragment:
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_xxx); // 必须加该判断,避免重建时重复添加Fragment覆盖原有栈 if (savedInstanceState == null) { // 此处为你原来加载默认首个Fragment的逻辑 getSupportFragmentManager().beginTransaction() .add(R.id.fragment_container, new DefaultFragment()) .commit(); } }
系统销毁Activity时会自动保存Fragment栈状态,重建时如果savedInstanceState不为null,会自动恢复之前的Fragment栈,不需要手动重新添加。
第二步:修正setResult传入的Intent类型
修改AddEditIntentActivity的saveIntent方法,明确使用系统android.content.Intent:
private void saveIntent() { // 明确指定使用系统Intent,不要使用自定义类 android.content.Intent data = new android.content.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"); finish(); // 直接调用finish即可,不需要走onBackPressed逻辑 Log.d("Cursor", "backPressed"); }
验证方法
打开开发者选项中的「不保留活动」开关,开启后每次离开Activity都会自动销毁,可以100%复现你遇到的问题,修改完代码后再测试即可确认问题是否解决。
内容的提问来源于stack exchange,提问作者Amruth Arunkumar

