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

Android Activity 數據返回傳遞:startActivityForResult 完整實現指南

     編輯:程式設計綜合問答

場景

Activity A 點擊 TextView 跳轉到 Activity B,B 獲取字符串後返回 A,A 更新 TextView 顯示。

核心機制:startActivityForResult + onActivityResult

請求碼標識請求,**結果碼**標護處理結果,**Intent**攜帶返回數據。

完整代碼實現

Activity A (啟動方)

public class ActivityA extends AppCompatActivity {
    private static final int REQUEST_CODE_B = 1001;
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);
        textView = findViewById(R.id.textView);
        
        textView.setOnClickListener(v -> {
            Intent intent = new Intent(this, ActivityB.class);
            startActivityForResult(intent, REQUEST_CODE_B);
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE_B && resultCode == RESULT_OK && data != null) {
            String result = data.getStringExtra("result_key");
            if (result != null) {
                textView.setText(result); // 更新 UI
            }
        }
    }
}

Activity B (返回方)

public class ActivityB extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);
        
        // 模擬獲取字符串(如從 EditText、網絡、掃碼等)
        String resultString = "來自 B 的數據: " + System.currentTimeMillis();
        
        // 封裝返回數據
        Intent resultIntent = new Intent();
        resultIntent.putExtra("result_key", resultString);
        setResult(RESULT_OK, resultIntent);
        finish(); // 關鍵:結束 B,觸發 A 的 onActivityResult
    }
    
    // 可選:返回鍵處理
    @Override
    public void onBackPressed() {
        setResult(RESULT_CANCELED);
        super.onBackPressed();
    }
}

現代替代方案:Activity Result API (AndroidX)

AndroidX Activity 1.2.0+ 推薦使用註冊回調方式,避免 requestCode 衝突,代碼更清晰:

Activity A (新寫法)

// 定義啟動器(成員變量)
private final ActivityResultLauncher launcherB = registerForActivityResult(
    new ActivityResultContracts.StartActivityForResult(),
    result -> {
        if (result.getResultCode() == RESULT_OK && result.getData() != null) {
            String str = result.getData().getStringExtra("result_key");
            textView.setText(str);
        }
    }
);

// 點擊事件中啟動
textView.setOnClickListener(v -> {
    launcherB.launch(new Intent(this, ActivityB.class));
});

常見坑點

  • finish() 前必須調用 setResult(),否則 A 收到 RESULT_CANCELED 且無數據。
  • 請求碼 requestCode 需全局唯一(傳統寫法),建議定義常量管理。
  • 單例/標準啟動模式下正常工作;若 B 為 singleTask 等特殊模式,可能需配合 onNewIntent。
  • 數據大小限制:Intent 承載數據建議 < 1MB,大數據用文件/共享內存/ViewModel。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved