एंड्रॉइड में एक्टिविटी परिणाम संभालना - आधुनिक API
नोट: startActivityForResult / onActivityResult **API 30 (Android 11) में डिप्रिकेट** हो गया है। आधुनिक विकल्प **Activity Result APIs** (ActivityResultContracts) है जो androidx.activity:activity:1.8.0+ में पेश किया गया है।
निर्भरता
dependencies {
implementation "androidx.activity:activity:1.8.2"
implementation "androidx.fragment:fragment:1.6.2"
}
आधुनिक दृष्टिकोण: Activity Result API
1. लॉन्चर पंजीकृत करें (गतिविधि/फ्रैगमेंट में)
public class MainActivity extends AppCompatActivity {
// सरल परिणाम के लिए (स्ट्रिंग वापस)
private final ActivityResultLauncher launcher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
if (result.getResultCode() == RESULT_OK && result.getData() != null) {
String returned = result.getData().getStringExtra("result");
TextView tv = findViewById(R.id.tvResult);
tv.setText("परिणाम: " + returned);
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btnLaunch).setOnClickListener(v -> {
Intent intent = new Intent(this, SecondActivity.class);
launcher.launch(intent);
});
}
}
2. द्वितीय एक्टिविटी (परिणाम सेट करती है)
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
// उदाहरण: तुरंत परिणाम वापस करें
Intent result = new Intent();
result.putExtra("result", "SecondActivity से डेटा");
setResult(RESULT_OK, result);
finish();
}
}
अन्य उपयोगी कॉन्ट्रैक्ट्स
| कॉन्ट्रैक्ट | इनपुट | आउटपुट | उपयोग-मामला |
|---|---|---|---|
TakePicture() | Uri (आउटपुट फ़ाइल) | Boolean | कैमरा फोटो |
PickContact() | Void | Uri | संपर्क चुनें |
GetContent() | String (MIME) | Uri | फाइल/इमेज चुनें |
RequestPermission() | String (परमिशन) | Boolean | रनटाइम परमिशन |
RequestMultiplePermissions() | String[] | Map | एकाधिक परमिशन |
लीगेसी कोड (केवल संदर्भ के लिए)
// डिप्रिकेट - नए कोड में उपयोग न करें
startActivityForResult(intent, REQUEST_CODE);
// ...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) { ... }
}
माइग्रेशन चेकलिस्ट
- निर्भरताएं जोड़ें (activity, fragment)।
registerForActivityResultके साथ लॉन्चर पंजीकृत करें (गतिविधि/फ्रैगमेंट में शीर्ष स्तर पर)।launcher.launch(intent)के साथ लॉन्च करें।- कॉलबैक में परिणाम संभालें।
- पुराने
startActivityForResult/onActivityResultको हटाएं।
सर्वोत्तम अभ्यास
- लॉन्चर को **फील्ड** के रूप में पंजीकृत करें,
onCreateके अंदर नहीं — यह कॉन्फिगरेशन परिवर्तनों पर जीवित रहता है। - प्रकार-सुरक्षित परिणामों के लिए विशिष्ट कॉन्ट्रैक्ट्स (
TakePicture,PickContact) का उपयोग करें। - फ्रैगमेंट्स के लिए,
registerForActivityResult(Fragment 1.3+ में उपलब्ध) का उपयोग करें। - परिणाम डेटा को पार्स करने से पहले नल-चेक करें।
परीक्षण
- ऐप चलाएं, "लॉन्च" दबाएं → SecondActivity खुलती है, तुरंत परिणाम के साथ समाप्त होती है।
- MainActivity टेक्स्ट व्यू में "परिणाम: SecondActivity से डेटा" दिखाता है।
- घुमाएं → लॉन्चर पुनः पंजीकृत होता है, कोई लीक नहीं।