Android:如何将Activity3的数据回显至首个主Activity?
解决Activity3回传数据到Activity1的报错问题
问题根源
你在onCreate里直接调用bundle.getString()时首次启动报错,是因为第一次启动Activity1时,它是从应用 launcher 打开的,此时getIntent().getExtras()会返回null,直接调用bundle.getString()就会触发NullPointerException。
快速修复当前代码
最简单的解决方式是先判断bundle是否为null,再执行赋值逻辑。修改Activity1的代码如下:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EditText edittext = findViewById(R.id.edittext); Bundle bundle = getIntent().getExtras(); // 先检查bundle是否存在,避免空指针 if (bundle != null) { String s = bundle.getString("datavalue"); edittext.setText(s); } }
这样首次启动时,bundle为null,不会执行setText操作,就不会报错了。
更规范的回传数据方案
不过上面的方式会重新创建一个Activity1的实例(默认启动模式下),如果你的需求是回到原来的Activity1实例并更新数据,更推荐以下两种方案:
方案1:使用Activity Result API(推荐,替代已废弃的startActivityForResult)
这种方式是让Activity1主动等待后续页面返回的数据,流程更清晰:
- 在Activity1中注册
ActivityResultLauncher:
private ActivityResultLauncher<Intent> activityResultLauncher; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 注册结果监听器 activityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK) { Intent data = result.getData(); if (data != null) { String returnedData = data.getStringExtra("datavalue"); EditText edittext = findViewById(R.id.edittext); edittext.setText(returnedData); } } } ); // 启动Activity2时使用这个launcher(替换你原来的启动逻辑) findViewById(R.id.your_start_activity2_button).setOnClickListener(v -> { Intent intent = new Intent(Activity1.this, Activity2.class); // 传递EditText的值到Activity2 intent.putExtra("editTextValue", edittext.getText().toString()); activityResultLauncher.launch(intent); }); }
- 在Activity3中返回数据给Activity1:
// 在Activity3中,当需要返回数据时(比如点击返回按钮) Intent resultIntent = new Intent(); resultIntent.putExtra("datavalue", "SomeData"); setResult(RESULT_OK, resultIntent); finish(); // 关闭Activity3,回到Activity2
- 在Activity2中把结果传递回Activity1:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 接收Activity3返回的数据,再传递给Activity1 if (resultCode == RESULT_OK) { setResult(RESULT_OK, data); finish(); // 关闭Activity2,回到Activity1 } } // 注意:Activity2启动Activity3时也要用startActivityForResult // 比如在Activity2的启动逻辑中: Intent intent = new Intent(Activity2.this, Activity3.class); // 传递从Activity1获取到的EditText值 intent.putExtra("receivedValue", getIntent().getStringExtra("editTextValue")); startActivityForResult(intent, 100); // 100是自定义请求码
方案2:使用启动模式+onNewIntent
如果你希望直接从Activity3回到原来的Activity1实例,可以通过设置Intent的flags来复用已有的Activity1:
- 修改Activity3的启动代码:
Intent i = new Intent(Activity3.this, Activity1.class); String data = "SomeData"; i.putExtra("datavalue", data); // 清除栈中Activity1之上的所有Activity,并复用已有的Activity1实例 i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(i); finish(); // 关闭Activity3
- 在Activity1中重写
onNewIntent方法处理返回的数据:
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); // 更新当前的Intent为新传入的Intent // 处理从Activity3返回的数据 Bundle bundle = intent.getExtras(); if (bundle != null) { String s = bundle.getString("datavalue"); EditText edittext = findViewById(R.id.edittext); edittext.setText(s); } } // 同时在onCreate中保留空判断逻辑,处理首次启动 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EditText edittext = findViewById(R.id.edittext); Bundle bundle = getIntent().getExtras(); if (bundle != null) { String s = bundle.getString("datavalue"); edittext.setText(s); } }
这样既解决了首次启动的报错问题,又能正确接收从Activity3返回的数据。
内容的提问来源于stack exchange,提问作者PankajR
相关产品推荐
相关产品推荐

