現象:startActivityForResult 啟動聯繫人選擇,返回時在 onActivityResult 中解析 getIntent().getExtras() 拋出 NPE。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// 錯誤:使用 getIntent() 獲取的是「啟動當前 Activity 的原始 Intent」,而非返回數據
int pos = Integer.parseInt(getIntent().getExtras().getString(Intent.EXTRA_TEXT));
}
getIntent():返回 **啟動當前 Activity 的那個 Intent**(此處為 MainActivity 的啟動 Intent,無 EXTRA_TEXT)。data 參數:**目標 Activity 通過 setResult 返回的 Intent**,攜帶選擇的聯繫人 URI 及自定義數據。@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PICK_REQUEST && resultCode == RESULT_OK && data != null) {
// 1. 獲取返回的聯繫人 URI
Uri contactUri = data.getData();
// 2. 獲取啟動時附加的額外數據(需在啟動 Intent 中 putExtra)
// 注意:返回的 data 默認不攜帶啟動時的 extras,需目標 Activity 手動 putExtra 回傳
// 更好的做法:在啟動前用請求碼區分,或用 onActivityResult 的 requestCode 反推上下文
Bundle extras = getIntent().getExtras(); // 這裡 getIntent() 可用,因為是當前 Activity 的啟動參數
if (extras != null) {
String myText = extras.getString(Intent.EXTRA_TEXT);
if (myText != null) {
int pos = Integer.parseInt(myText);
// 使用 pos...
}
}
}
}
// 啟動時
Intent i = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
i.putExtra("arg2", arg2); // 自定義 key
startActivityForResult(i, PICK_REQUEST);
// 返回時
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PICK_REQUEST && resultCode == RESULT_OK) {
int arg2 = getIntent().getIntExtra("arg2", -1); // 從啟動 Intent 取回
Uri contactUri = data.getData(); // 從返回 Intent 取聯繫人
// 處理...
}
}
Bundle extras = getIntent().getExtras();
if (extras == null) { Log.e(TAG, "No extras"); return; }
String text = extras.getString("key");
if (text == null) { Log.e(TAG, "Key missing"); return; }
int value = Integer.parseInt(text);
明確 getIntent() 與 onActivityResult(data) 的語義邊界,消除 NPE 隱患。