调用startActivityForResult后onActivityResult获取Intent为null问题咨询
我来帮你排查几个常见的问题点,应该能解决你遇到的Intent为null的情况:
1. 检查onActivityResult的参数名称错误
看你贴的代码片段:
@Override protected void onActivityResult(int requestCode,int resultCode,Intent intent) { super.onActivityResult(requestCode, resultCode, data); if (requestCode==this.uploadReques... }
这里方法参数定义的是Intent intent,但你调用super.onActivityResult时传的是data,后续判断逻辑里大概率也误用了未定义的data变量——这直接导致你拿到的是未初始化的null值。
修正方法:把参数名统一成data(或者保持intent,但要全程一致):
@Override protected void onActivityResult(int requestCode,int resultCode,Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == this.uploadRequestCode && resultCode == Activity.RESULT_OK) { // 这里使用data就不会是null了 String resultData = data.getStringExtra("data"); // 处理返回的数据 } }
2. 确保setResult在finish()之前调用,且无提前finish的逻辑
虽然你写了setResult(Activity.RESULT_OK,i); finish();,但要检查第二个Activity中有没有其他地方提前调用了finish()——比如重写的onBackPressed方法、某些按钮点击事件里的逻辑。
举个例子,如果重写了返回键逻辑,一定要先设置结果再触发finish:
@Override public void onBackPressed() { Intent i = getIntent(); i.putExtra("data", "你的数据内容"); setResult(Activity.RESULT_OK, i); super.onBackPressed(); // super方法内部会调用finish(),所以要先执行setResult }
另外,不要在onPause或onStop中调用setResult,这些时机Activity可能已被系统回收,导致结果无法正确传递。
3. 检查启动第二个Activity时的Intent标志
如果启动第二个Activity时添加了FLAG_ACTIVITY_NEW_TASK或FLAG_ACTIVITY_CLEAR_TASK这类特殊标志,会破坏startActivityForResult的回调机制——因为这些标志会让目标Activity在新任务栈中启动,无法将结果返回给原Activity。
确保启动代码是标准写法:
Intent intent = new Intent(FirstActivity.this, SecondActivity.class); startActivityForResult(intent, uploadRequestCode);
4. 确认传递的数据可被序列化
如果你传递的some data是自定义对象,必须让它实现Serializable或Parcelable接口,否则Intent无法携带该数据,可能间接导致回调时Intent为null。
比如自定义对象实现Serializable:
public class MyCustomData implements Serializable { // 类成员变量和方法 }
然后传递数据:
i.putExtra("data", new MyCustomData());
如果以上几点都检查修正后,应该就能解决Intent为null的问题了。
内容的提问来源于stack exchange,提问作者Gili Jacobi

