首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android Intent 傳遞數據空指針異常排查:onActivityResult 中錯誤使用 getIntent() 而非 data 參數

     編輯:程式設計綜合問答

現象: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));
}

根因:混淆了「啟動 Intent」與「返回 Intent」

  • 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 安全解析

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 隱患。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved