ActivityResultRegistry เป็นแนวทางที่แนะนำ
ComponentActivity
ตอนนี้ให้สิ่งActivityResultRegistry
ที่ช่วยให้คุณจัดการstartActivityForResult()
+ onActivityResult()
รวมถึงrequestPermissions()
+ onRequestPermissionsResult()
โฟลว์โดยไม่ต้องใช้วิธีการแทนที่ในของคุณActivity
หรือFragment
เพิ่มความปลอดภัยให้กับประเภทผ่านทางActivityResultContract
และเพิ่มตะขอสำหรับการทดสอบกระแสเหล่านี้
ขอแนะนำอย่างยิ่งให้ใช้ API ผลลัพธ์ของกิจกรรมที่แนะนำใน AndroidX Activity 1.2.0-alpha02 และ Fragment 1.3.0-alpha02
เพิ่มไปยังของคุณ 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"
จะใช้สัญญาที่สร้างไว้ล่วงหน้าได้อย่างไร
API ใหม่นี้มีฟังก์ชันที่สร้างไว้ล่วงหน้าดังต่อไปนี้
- TakeVideo
- PickContact
- GetContent
- GetContents
- OpenDocument
- โอเพนด็อกคิวเมนต์
- OpenDocumentTree
- CreateDocument
- หมุน
- ถ่ายภาพ
- RequestPermission
- 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
เป็นเพียงการเรียกกลับซึ่งส่งกลับบิตแมปที่ nullable - หรือไม่ว่ามันเป็นโมฆะขึ้นอยู่กับว่าonActivityResult
กระบวนการประสบความสำเร็จหรือไม่ prepareCall
จากนั้นลงทะเบียนการโทรนี้ในคุณลักษณะใหม่ที่ComponentActivity
เรียกว่าActivityResultRegistry
- เราจะกลับมาที่นี่ในภายหลัง ActivityResultContracts.TakePicture()
เป็นหนึ่งในผู้ช่วยเหลือในตัวที่ Google ได้สร้างสำหรับเราและในที่สุดก็กล่าวอ้างจริงเรียกเจตนาในลักษณะเดียวกับที่คุณจะก่อนหน้านี้ด้วยtakePicture
Activity.startActivityForResult(intent, REQUEST_CODE)
จะเขียนสัญญาที่กำหนดเองได้อย่างไร
สัญญาง่าย ๆ ที่ใช้ Int เป็นอินพุตและส่งคืนสตริงที่ร้องขอกิจกรรมส่งคืนในผลลัพธ์ของเจตนา
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)
}
}
}
ตรวจสอบเอกสารอย่างเป็นทางการนี้สำหรับข้อมูลเพิ่มเติม