前言

在安卓开发中,跳转和申请权限设计的比较麻烦,网上有很多优秀的库解决这个问题,谷歌对这个问题做了处理,废弃了以前的方法。具体的使用方法可以参考末尾的参考博客。下面是对这些方法做的基本封装,方便使用。

IntentKtx

这个类是对普通跳转的封装,可以用也可以不用,主要是方便实现简单的跳转。都是扩展函数,直接在 Activity/Fragment 中使用即可。

  1. intentOf :专门用来生成不同类型的 Intent
  2. createIntent :生成Intent并添加参数(可选)
  3. createIntentStart :生成跳转的Intent并添加参数,也可以不添加参数
  4. addPair :Intent 添加参数
  5. startActivityK :跳转
  6. browse :打开浏览器
  7. share :生调用分享,只能分享文本
  8. email :发送邮件
  9. makeCallPermission :拨打电话,需要权限
  10. makeCall :拨打电话
  11. sendSMS :发送短信

封装使用界面跳转

最新版可以参考官网 Activity,Framgnet

1.导入依赖

我试了一下只导入最后一个也可以,只是 activity对应的版本不是最新的,如果想两个都是最新的就像下面这样,导入两个就行了。下面是原生的依赖导入:

  1. //activity
  2. def activity_version = "1.2.3"
  3. // Java language implementation
  4. // implementation "androidx.activity:activity:$activity_version"
  5. // Kotlin
  6. api "androidx.activity:activity-ktx:$activity_version"
  7. //fragment
  8. def fragment_version = "1.3.4"
  9. // Java language implementation
  10. // implementation "androidx.fragment:fragment:$fragment_version"
  11. // Kotlin
  12. api "androidx.fragment:fragment-ktx:$fragment_version"

封装后的依赖导入,最新版看最后的项目地址:

  1. maven { url 'https://www.jitpack.io' }
  2. implementation 'com.gitee.quetzalcoatl:ActivityResultApi:0.0.3'

2.跳转使用

  1. 第一步生成 ActivityResultLauncher,在这里面可以监听回调。
  1. private val startTest = startActivityForResultK {
  2. //这里是回调,相当于 onActivityResult
  3. if (it.resultCode == RESULT_OK){
  4. //获取回传值,这里就是以前的 intent
  5. it.data?.run {
  6. Toast.makeText(this@MainActivity,
  7. "${getStringExtra("result")}", Toast.LENGTH_SHORT).show()
  8. }
  9. }
  10. }
  1. 第二步调用跳转
  1. fun testStart(view: View) {
  2. //调用跳转
  3. startTest.launch(createIntentStart<WelcomeActivity>("text" to "这里可以传多个参数"))
  4. }
  1. 获取参数,回传信息
    这里和以前用法一样,没有变化,示例如下:
  1. tvText.text = intent.getStringExtra("text")
  2. //回传任意值
  3. setResult(RESULT_OK,createIntent("result" to "hello"))
  4. finish()

申请权限

申请权限和上面使用步骤类似,这里做了两种封装,一个单纯的扩展函数,可以直接调用。另一个对扩展做了封装,可以更方便调用。具体用法看下面。

申请单个权限

  1. 和以前一样在清单文件申请权限,这里随便申请两个权限
  1. <uses-permission android:name="android.permission.CAMERA"/>
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

carme 和 write 就是这两个权限。

  1. 提前生成对象ActivityResultLauncher,两种用法看个人更喜欢哪种
  1. //ktx 的用法
  2. val single = requestPermission(camera,
  3. granted = {
  4. //同意权限
  5. }, denied = {
  6. //拒绝权限
  7. }, explained = {
  8. //拒绝并且不再显示
  9. })
  1. // dsl 用法, 更好用更省事
  2. val singleDsl = requestPermissionK(camera) {
  3. //有两种写法,个人更喜欢下面这种不用写=,两个都写只有一个生效
  4. //granted = {}
  5. granted { /*同意权限*/ }
  6. denied { /*拒绝权限*/ }
  7. explained { /*拒绝并且不再显示*/ }
  1. 调用
  1. //调用
  2. // single.launch(camera)
  3. singleDsl.launch(camera)

申请多个权限

使用方法基本和上面类似,这次全部放在一起。

  1. //ktx 写法
  2. val multiple = requestMultiplePermissions(
  3. allGranted = {
  4. //全部同意
  5. },denied = {
  6. //拒绝
  7. },explained = {
  8. //拒绝并不再显示
  9. }
  10. )
  11. //dsl
  12. val multipleDsl = requestPermissionK {
  13. allGranted { }
  14. denied { }
  15. explained { }
  16. }
  17. fun applyMultiple(view: View) {
  18. // multiple.launch(arrayOf(camera,write))
  19. multipleDsl.launch(arrayOf(camera,write))
  20. }

参考

项目地址

开源项目:使用 Activity Result API + Kotlin 扩展函数 封装权限请求库(支持 DSL 写法)

Jetpack Activity Result API 优雅的实现页面传值

Android 新出功能 ActivityResultContract,真香!

你好,Activity Results API!