初學者常嘗試在 `ActivityA` 中通過 `findViewById()` 或持有 `ActivityB` 實例來直接操作 `ActivityB` 的 UI 控件(`TextView`、`EditText` 等),結果導致 `NullPointerException` 或介面不更新。
// A → B
Intent intent = new Intent(A.this, B.class);
intent.putExtra("key", value);
startActivity(intent);
// B 取值
String val = getIntent().getStringExtra("key");
// A 啟動 B 並期待結果
ActivityResultLauncher<Intent> launcher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> { if (result.getResultCode() == RESULT_OK) { ... } }
);
launcher.launch(new Intent(A.this, B.class));
// B 返回結果
Intent data = new Intent();
data.putExtra("result", "ok");
setResult(RESULT_OK, data);
finish();
// 共享 ViewModel(以 Application 或 Activity 為作用域)
public class SharedViewModel extends ViewModel {
MutableLiveData<String> data = new MutableLiveData<>();
}
// A、B 皆通過 ViewModelProvider 獲取同一實例
SharedViewModel vm = new ViewModelProvider(this).get(SharedViewModel.class);
vm.data.observe(this, s -> { /* 更新 UI */ });
vm.data.setValue("new value");
適用於多組件鬆耦合通訊,注意生命週期註冊/解註冊。
Activity 之間不共享視圖,只共享數據。 透過 Intent、ViewModel、資料庫、事件總線等機制傳遞「數據」,各自在自己的生命週期內根據數據更新「各自的視圖」,才是 Android 架構設計的正確哲學。