Android中onActivityResult未调用求助:已按方案操作仍失效
问题排查与解决方案
嘿,我帮你找出了导致onActivityResult()没被调用的关键问题,还有几个可以优化的点,咱们一步步来:
1. 核心问题:Application级别的android:noHistory="true"属性
你在Manifest的<application>标签里设置了android:noHistory="true",这个属性会让应用内所有Activity在离开(比如跳转到另一个Activity)后被立即销毁,不会保留在任务栈中。当你从AddressActivity返回PaymentActivity时,PaymentActivity已经被系统销毁了,自然无法触发onActivityResult()方法。这是最主要的原因。
2. 次要问题:ResultCode使用不规范(非直接原因,但易引发后续问题)
你自定义了resultCode为2,虽然语法上没问题,但Android系统提供了标准的结果码常量(比如Activity.RESULT_OK=-1、Activity.RESULT_CANCELED=0),使用这些标准常量更易读,也能避免和系统预留值冲突。
修改方案
第一步:移除Application的noHistory属性
打开Manifest文件,删掉<application>标签里的android:noHistory="true":
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.vuclip.liqyd"> <application android:name=".LiqydApp" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" <!-- 移除这一行 --> android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <!-- 所有Activity配置保持不变 --> </application> </manifest>
如果确实需要某个Activity设置noHistory,单独给该Activity标签添加android:noHistory="true"即可,不要在Application级别全局设置。
第二步:规范ResultCode的使用
调用方PaymentActivity修改onActivityResult:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d(TAG, "onActivityResult: called"); super.onActivityResult(requestCode, resultCode, data); // 同时匹配请求码(2)和标准结果码RESULT_OK if (requestCode == 2 && resultCode == Activity.RESULT_OK && data != null) { if (validIntent(data)) { addressTextView.setText( MessageFormat.format("{0},{1}\n{2}", data.getStringExtra(UserConstants.USER_ADDRESS_1), data.getStringExtra(UserConstants.USER_ADDRESS_2), data.getStringExtra(UserConstants.USER_ADDRESS_LANDMARK))); } } }
被调用方AddressActivity修改返回逻辑:
Intent resultIntent = new Intent(); resultIntent.putExtra(UserConstants.USER_ADDRESS_1, address1.getText().toString()); resultIntent.putExtra(UserConstants.USER_ADDRESS_2, address2.getText().toString()); resultIntent.putExtra(UserConstants.USER_ADDRESS_LANDMARK, landmark.getText().toString()); // 使用系统标准结果码 setResult(Activity.RESULT_OK, resultIntent); // 必须调用finish()关闭当前Activity,才能回到调用方并触发onActivityResult finish();
内容的提问来源于stack exchange,提问作者Ezio
相关产品推荐
相关产品推荐

