1.在app下的build.gradle引入:
implementation 'androidx.activity:activity:1.2.0-beta01'
implementation 'androidx.fragment:fragment:1.3.0-beta01'
2.页面普通跳转(原startActivityForResult)
(1)第一个页面:
class MainActivity : AppCompatActivity() {
private lateinit var textview: TextView
private val myActivityLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { activityResult->
if (activityResult.resultCode == RESULT_OK){
val result = activityResult.data?.getStringExtra("result")
textview.text = "回传数据:$result"
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
textview = findViewById(R.id.textview)
findViewById<Button>(R.id.button).setOnClickListener {
val intent = Intent(this, SecondActivity::class.java).apply {
putExtra("name", "第一个页面传递的数据")
}
myActivityLauncher.launch(intent)
}
}
}
(2)第二个页面:
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
val textView = findViewById<TextView>(R.id.textview)
val name = intent.getStringExtra("name")
textView.text = "接收数据:$name"
textView.setOnClickListener {
val intent = Intent().apply {
putExtra("result", "第二个页面回传数据")
}
setResult(RESULT_OK, intent)
finish()
}
}
}
(3)效果:
第二个页面:
第一个页面:
3.权限申请:
class MainActivity : AppCompatActivity() {
private lateinit var textview: TextView
private val myActivityLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { activityResult ->
if (activityResult.resultCode == RESULT_OK) {
val result = activityResult.data?.getStringExtra("result")
textview.text = "回传数据:$result"
}
}
//请求单个权限
private val requestOnePermission =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
if (isGranted) Toast.makeText(this, "权限已授予", Toast.LENGTH_SHORT).show()
else Toast.makeText(this, "权限被拒绝", Toast.LENGTH_SHORT).show()
}
//请求一组权限
private val requestMultiplePermissions =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions: Map<String, Boolean> ->
if (permissions.entries.any { !it.value }){
Toast.makeText(this, "权限被拒绝", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this, "权限已授予", Toast.LENGTH_SHORT).show()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
textview = findViewById(R.id.textview)
findViewById<Button>(R.id.button).setOnClickListener {
val intent = Intent(this, SecondActivity::class.java).apply {
putExtra("name", "第一个页面传递的数据")
}
myActivityLauncher.launch(intent)
}
findViewById<Button>(R.id.button1).setOnClickListener {
requestOnePermission.launch(Manifest.permission.CAMERA)
}
findViewById<Button>(R.id.button2).setOnClickListener {
requestMultiplePermissions.launch(
arrayOf(
Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.WRITE_EXTERNAL_STORAGE
)
)
}
}
}
4. 预定义的Contract
StartActivityForResult()
RequestMultiplePermissions()
RequestPermission()
TakePicturePreview()
TakePicture()
TakeVideo()
PickContact()
CreateDocument()
OpenDocumentTree()
OpenMultipleDocuments()
OpenDocument()
GetMultipleContents()
GetContent()
StartActivityForResult: 通用的Contract,不做任何转换,Intent作为输入,ActivityResult作为输出,这也是最常用的一个协定。
- RequestMultiplePermissions: 用于请求一组权限
- RequestPermission: 用于请求单个权限
- TakePicturePreview: 调用MediaStore.ACTION_IMAGE_CAPTURE拍照,返回值为Bitmap图片
- TakePicture: 调用MediaStore.ACTION_IMAGE_CAPTURE拍照,并将图片保存到给定的Uri地址,返回true表示保存成功。
- TakeVideo: 调用MediaStore.ACTION_VIDEO_CAPTURE 拍摄视频,保存到给定的Uri地址,返回一张缩略图。
- PickContact: 从通讯录APP获取联系人
- GetContent: 提示用选择一条内容,返回一个通过ContentResolver#openInputStream(Uri)访问原生数据的Uri地址(content://形式) 。默认情况下,它增加了 Intent#CATEGORY_OPENABLE, 返回可以表示流的内容。
- CreateDocument: 提示用户选择一个文档,返回一个(file:/http:/content:)开头的Uri。
- OpenMultipleDocuments: 提示用户选择文档(可以选择多个),分别返回它们的Uri,以List的形式。
- OpenDocumentTree: 提示用户选择一个目录,并返回用户选择的作为一个Uri返回,应用程序可以完全管理返回目录中的文档。
上面这些预定义的Contract中,除了StartActivityForResult和RequestMultiplePermissions之外,基本都是处理的与其他APP交互,返回数据的场景,比如,拍照,选择图片,选择联系人,打开文档等等。使用最多的就是StartActivityForResult和RequestMultiplePermissions了。