ActivityResultRegistry는 권장되는 방법입니다.
ComponentActivity
지금 제공 ActivityResultRegistry
당신이 처리 할 수 있다는 startActivityForResult()
+를 onActivityResult()
뿐만 아니라 requestPermissions()
+는 onRequestPermissionsResult()
당신의 방법을 무시하지 않고 흐름 Activity
또는 Fragment
를 통해 증가 된 형태의 안전성을 제공 ActivityResultContract
하고, 이러한 흐름을 테스트하기 위해 후크를 제공합니다.
AndroidX Activity 1.2.0-alpha02 및 Fragment 1.3.0-alpha02에 도입 된 Activity Result API를 사용하는 것이 좋습니다.
이것을 당신의 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에는 다음과 같은 사전 구축 기능이 있습니다
- 비디오 가져 오기
- 연락처
- GetContent
- GetContents
- OpenDocument
- OpenDocuments
- OpenDocumentTree
- 문서 작성
- 다이얼
- 사진을 촬영
- RequestPermission
- 요청 권한
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 비트 맵을 반환하는 콜백입니다. null인지 여부는 onActivityResult
프로세스의 성공 여부에 따라 다릅니다 . prepareCall
다음의 새로운 기능에이 호출 등록 ComponentActivity
(가)라고 ActivityResultRegistry
우리가 나중에 다시 올 것이다을 -. ActivityResultContracts.TakePicture()
은 Google이 우리를 위해 만든 기본 제공 도우미 중 하나이며 마지막으로 호출 takePicture
하면 이전과 같은 방식으로 실제로 의도를 트리거합니다 Activity.startActivityForResult(intent, REQUEST_CODE)
.
맞춤 계약을 작성하는 방법은 무엇입니까?
Int를 입력으로 사용하고 요청 된 Activity가 결과 인 텐트에 반환 한 문자열을 반환하는 간단한 계약입니다.
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)
}
}
}
자세한 내용은 이 공식 문서를 확인하십시오 .