Loading...
墨滴

kiwilss

2021/07/03  阅读:68  主题:科技蓝

Activity Result Api DSl

前言

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

IntentKtx

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

createIntent            :生成Intent并添加参数(可选)
createIntentStart       :生成跳转的Intent并添加参数,也可以不添加参数
addPair                 :Intent 添加参数
startActivityK          :跳转

browse                  :打开浏览器
share                   :生调用分享,只能分享文本
email                   :发送邮件
makeCallPermission  :拨打电话,需要权限
makeCall                :拨打电话
sendSMS                 :发送短信

封装使用界面跳转

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

1.导入依赖

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

   //activity
    def activity_version = "1.2.3"
    // Java language implementation
//    implementation "androidx.activity:activity:$activity_version"
    // Kotlin
    api "androidx.activity:activity-ktx:$activity_version"
    //fragment
    def fragment_version = "1.3.4"
    // Java language implementation
//    implementation "androidx.fragment:fragment:$fragment_version"
    // Kotlin
    api "androidx.fragment:fragment-ktx:$fragment_version"

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

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

2.跳转使用

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

申请权限

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

申请单个权限

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

carme 和 write 就是这两个权限。

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

申请多个权限

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

  //ktx 写法
    val multiple = requestMultiplePermissions(
        allGranted = {
            //全部同意
        },denied = {
            //拒绝
        },explained = {
            //拒绝并不再显示
        }
    )
    //dsl
    val multipleDsl = requestPermissionK {
        allGranted {  }
        denied {  }
        explained {  }
    }
    fun applyMultiple(view: View) {
//        multiple.launch(arrayOf(camera,write))
        multipleDsl.launch(arrayOf(camera,write))
    }

参考

项目地址

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

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

Android 新出功能 ActivityResultContract,真香!

你好,Activity Results API!

kiwilss

2021/07/03  阅读:68  主题:科技蓝

作者介绍

kiwilss