ActivityResultRegistry là cách tiếp cận được đề xuất
ComponentActivity
hiện cung cấp một ActivityResultRegistry
cho phép bạn xử lý startActivityForResult()
+ onActivityResult()
cũng như requestPermissions()
+onRequestPermissionsResult()
chảy mà không trọng phương pháp trong bạn Activity
hay Fragment
, mang đến tăng độ an toàn loại qua ActivityResultContract
, và cung cấp móc để thử nghiệm những dòng chảy.
Chúng tôi khuyên bạn nên sử dụng API kết quả hoạt động được giới thiệu trong AndroidX Activity 1.2.0-alpha02 và Fragment 1.3.0-alpha02.
Thêm cái này vào 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"
Làm thế nào để sử dụng hợp đồng xây dựng trước?
API mới này có các chức năng được xây dựng trước như sau
- Video
- PickContact
- Có được nội dung
- GetContents
- OpenDocument
- OpenDocument
- OpenDocumentTree
- TạoDocument
- Quay số
- Chụp ảnh
- Xin phep
- RequestPermissions
Một ví dụ sử dụng hợp đồng 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() }
}
Vậy chuyện gì đang xảy ra ở đây? Hãy phá vỡ nó một chút. takePicture
chỉ là một cuộc gọi lại trả về một Bitmap không thể thực hiện được - việc nó có rỗng hay không phụ thuộc vào việc onActivityResult
quá trình có thành công hay không . prepareCall
sau đó đăng ký cuộc gọi này vào một tính năng mới ComponentActivity
được gọi là ActivityResultRegistry
- chúng tôi sẽ quay lại vấn đề này sau. ActivityResultContracts.TakePicture()
là một trong những trợ giúp tích hợp mà Google đã tạo cho chúng tôi và cuối cùng gọi takePicture
thực sự kích hoạt Ý định theo cách mà bạn đã làm trước đây Activity.startActivityForResult(intent, REQUEST_CODE)
.
Làm thế nào để viết một hợp đồng tùy chỉnh?
Hợp đồng đơn giản lấy Int làm Đầu vào và trả về Chuỗi yêu cầu Activity trả về kết quả Ý định.
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)
}
}
}
Kiểm tra tài liệu chính thức này để biết thêm.