ActivityResultRegistry adalah pendekatan yang direkomendasikan
ComponentActivitysekarang menyediakan ActivityResultRegistryyang memungkinkan Anda menangani startActivityForResult()+ onActivityResult()serta requestPermissions()+ onRequestPermissionsResult()mengalir tanpa mengesampingkan metode di Activityatau Fragment, membawa peningkatan keamanan jenis melaluiActivityResultContract , dan menyediakan kait untuk menguji aliran ini.
Sangat disarankan untuk menggunakan API Hasil Aktivitas yang diperkenalkan di AndroidX Activity 1.2.0-alpha02 dan Fragment 1.3.0-alpha02.
Tambahkan ini ke 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"
Bagaimana cara menggunakan kontrak pra-bangun?
API baru ini memiliki fungsionalitas pra dibangun berikut
- TakeVideo
- PickContact
- GetContent
- GetContents
- OpenDocument
- OpenDocuments
- OpenDocumentTree
- Buat Dokumen
- Panggil
- Mengambil gambar
- PermintaanPermission
- RequestPermissions
Contoh yang menggunakan kontrak 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() }
}
Jadi apa yang terjadi di sini? Mari kita memecahnya sedikit. takePicturehanyalah panggilan balik yang mengembalikan Bitmap yang dapat dibatalkan - apakah atau tidak itu null tergantung pada apakah onActivityResultprosesnya berhasil atau tidak . prepareCallkemudian daftarkan panggilan ini ke fitur baru yang ComponentActivitydisebut ActivityResultRegistry- kami akan kembali ke sini nanti. ActivityResultContracts.TakePicture()adalah salah satu pembantu bawaan yang dibuat Google untuk kami, dan akhirnya memohon takePicturesebenarnya memicu Intent dengan cara yang sama seperti sebelumnya Activity.startActivityForResult(intent, REQUEST_CODE).
Bagaimana cara menulis kontrak khusus?
Kontrak sederhana yang menggunakan Int sebagai Input dan mengembalikan String yang meminta Aktivitas mengembalikan pada Intent hasil.
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)
}
}
}
Periksa dokumentasi resmi ini untuk informasi lebih lanjut.