ActivityResultRegistry - рекомендуемый подход
ComponentActivity
теперь предоставляет ActivityResultRegistry
, который позволяет вам обрабатывать потоки _3 _ + _ 4_, а также _5 _ + _ 6_ без переопределения методов в ваших Activity
или Fragment
, обеспечивает повышенную безопасность типов с помощью ActivityResultContract
и предоставляет ловушки для тестирования этих потоков.
Настоятельно рекомендуется использовать API результатов деятельности, представленные в Android 10 Activity 1.2.0-alpha02 и Fragment 1.3.0-alpha02.
Добавьте это в свой build.gradle
def activity_version = "1.2.0-beta01"
// Java language implementation
implementation "androidx.activity:activity:$activity_version"
// Kotlin
implementation "androidx.activity:activity-ktx:$activity_version"
Как использовать готовый контракт
Этот новый API имеет следующие встроенные функции
- TakeVideo
- PickContact
- GetContent
- 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
- это просто обратный вызов, который возвращает растровое изображение, допускающее значение NULL, - значение NULL зависит от того, был ли процесс onActivityResult
успешным. prepareCall
затем регистрирует этот вызов в новой функции на ComponentActivity
под названием ActivityResultRegistry
- мы вернемся к этому позже. ActivityResultContracts.TakePicture()
- один из встроенных помощников, которые Google создал для нас, и, наконец, вызов takePicture
фактически запускает намерение так же, как вы делали это раньше с Activity.startActivityForResult(intent, REQUEST_CODE)
.
Как написать индивидуальный договор
Простой контракт, который принимает Int в качестве ввода и возвращает строку, которую запрашиваемое действие возвращает в результате Intent.
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)
}
}
}
Дополнительную информацию см. В этой официальной документации.
person
Darish
schedule
03.04.2020