ActivityResultRegistry adalah pendekatan yang direkomendasikan
ComponentActivity
sekarang menyediakan ActivityResultRegistry
yang memungkinkan Anda menangani startActivityForResult()
+ onActivityResult()
serta requestPermissions()
+ onRequestPermissionsResult()
mengalir tanpa mengesampingkan metode di Activity
atau 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. takePicture
hanyalah panggilan balik yang mengembalikan Bitmap yang dapat dibatalkan - apakah atau tidak itu null tergantung pada apakah onActivityResult
prosesnya berhasil atau tidak . prepareCall
kemudian daftarkan panggilan ini ke fitur baru yang ComponentActivity
disebut ActivityResultRegistry
- kami akan kembali ke sini nanti. ActivityResultContracts.TakePicture()
adalah salah satu pembantu bawaan yang dibuat Google untuk kami, dan akhirnya memohon takePicture
sebenarnya 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.