ActivityResultRegistry अनुशंसित दृष्टिकोण है
ComponentActivity
अब एक प्रदान करता है ActivityResultRegistry
आप को संभाल देता है कि startActivityForResult()
+ onActivityResult()
के रूप में रूप में अच्छी तरह requestPermissions()
+ onRequestPermissionsResult()
अपने में तरीकों अधिभावी बिना बहती है Activity
या Fragment
, के माध्यम से वृद्धि हुई प्रकार सुरक्षा लाता है ActivityResultContract
, और परीक्षण इन बहती के लिए हुक प्रदान करता है।
AndroidX गतिविधि 1.2.0-Alpha02 और Fragment 1.3.0-Alpha22 में शुरू की गई गतिविधि परिणाम एपीआई का उपयोग करने के लिए दृढ़ता से अनुशंसा की जाती है।
इसे अपने में जोड़ें build.gradle
def activity_version = "1.2.0-alpha03"
// Java language implementation
implementation "androidx.activity:activity:$activity_version"
// Kotlin
implementation "androidx.activity:activity-ktx:$activity_version"
पूर्व-निर्मित अनुबंध का उपयोग कैसे करें?
इस नए एपीआई में निम्नलिखित पूर्व निर्मित कार्य हैं
- वीडियो बनाओ
- PickContact
- सामग्री लो
- GetContents
- OpenDocument
- OpenDocuments
- OpenDocumentTree
- CreateDocument
- डायल
- तस्वीर ले लो
- अनुमति का अनुरोध करें
- RequestPermissions
एक उदाहरण जो takePicture अनुबंध का उपयोग करता है:
private val takePicture = prepareCall(ActivityResultContracts.TakePicture())
{ bitmap: Bitmap? ->
// Do something with the Bitmap, if present
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener { takePicture() }
}
तो यहां क्या हो रहा है? चलो इसे थोड़ा नीचे तोड़ो। takePicture
बस एक कॉलबैक है जो एक अशक्त बिटमैप को लौटाता है - यह शून्य है या नहीं यह इस बात पर निर्भर करता है कि onActivityResult
प्रक्रिया सफल थी या नहीं । prepareCall
फिर इस कॉल को एक नई सुविधा में पंजीकृत करता है ComponentActivity
जिसे कहा जाता है ActivityResultRegistry
- हम इसके बाद वापस आएंगे। ActivityResultContracts.TakePicture()
उन अंतर्निहित मददगारों में से एक है जो Google ने हमारे लिए बनाए हैं, और अंत में आह्वान takePicture
वास्तव में उसी तरह से आशय को ट्रिगर करता है जैसे आप पहले करते थे Activity.startActivityForResult(intent, REQUEST_CODE)
।
कस्टम अनुबंध कैसे लिखें?
सरल अनुबंध जो इंट को एक इनपुट के रूप में लेता है और स्ट्रिंग का रिटर्न करता है जो परिणाम के उद्देश्य से गतिविधि रिटर्न का अनुरोध करता है।
class MyContract : ActivityResultContract<Int, String>() {
companion object {
const val ACTION = "com.myapp.action.MY_ACTION"
const val INPUT_INT = "input_int"
const val OUTPUT_STRING = "output_string"
}
override fun createIntent(input: Int): Intent {
return Intent(ACTION)
.apply { putExtra(INPUT_INT, input) }
}
override fun parseResult(resultCode: Int, intent: Intent?): String? {
return when (resultCode) {
Activity.RESULT_OK -> intent?.getStringExtra(OUTPUT_STRING)
else -> null
}
}
}
class MyActivity : AppCompatActivity() {
private val myActionCall = prepareCall(MyContract()) { result ->
Log.i("MyActivity", "Obtained result: $result")
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
button.setOnClickListener {
myActionCall(500)
}
}
}
अधिक जानकारी के लिए इस आधिकारिक दस्तावेज की जाँच करें ।