前言
在安卓开发中,跳转和申请权限设计的比较麻烦,网上有很多优秀的库解决这个问题,谷歌对这个问题做了处理,废弃了以前的方法。具体的使用方法可以参考末尾的参考博客。下面是对这些方法做的基本封装,方便使用。
IntentKtx
这个类是对普通跳转的封装,可以用也可以不用,主要是方便实现简单的跳转。都是扩展函数,直接在 Activity/Fragment 中使用即可。
intentOf :专门用来生成不同类型的 IntentcreateIntent :生成Intent并添加参数(可选)createIntentStart :生成跳转的Intent并添加参数,也可以不添加参数addPair :Intent 添加参数startActivityK :跳转browse :打开浏览器share :生调用分享,只能分享文本email :发送邮件makeCallPermission :拨打电话,需要权限makeCall :拨打电话sendSMS :发送短信
封装使用界面跳转
1.导入依赖
我试了一下只导入最后一个也可以,只是 activity对应的版本不是最新的,如果想两个都是最新的就像下面这样,导入两个就行了。下面是原生的依赖导入:
//activitydef activity_version = "1.2.3"// Java language implementation// implementation "androidx.activity:activity:$activity_version"// Kotlinapi "androidx.activity:activity-ktx:$activity_version"//fragmentdef fragment_version = "1.3.4"// Java language implementation// implementation "androidx.fragment:fragment:$fragment_version"// Kotlinapi "androidx.fragment:fragment-ktx:$fragment_version"
封装后的依赖导入,最新版看最后的项目地址:
maven { url 'https://www.jitpack.io' }implementation 'com.gitee.quetzalcoatl:ActivityResultApi:0.0.3'
2.跳转使用
- 第一步生成 ActivityResultLauncher,在这里面可以监听回调。
private val startTest = startActivityForResultK {//这里是回调,相当于 onActivityResultif (it.resultCode == RESULT_OK){//获取回传值,这里就是以前的 intentit.data?.run {Toast.makeText(this@MainActivity,"${getStringExtra("result")}", Toast.LENGTH_SHORT).show()}}}
- 第二步调用跳转
fun testStart(view: View) {//调用跳转startTest.launch(createIntentStart<WelcomeActivity>("text" to "这里可以传多个参数"))}
- 获取参数,回传信息
这里和以前用法一样,没有变化,示例如下:
tvText.text = intent.getStringExtra("text")//回传任意值setResult(RESULT_OK,createIntent("result" to "hello"))finish()
申请权限
申请权限和上面使用步骤类似,这里做了两种封装,一个单纯的扩展函数,可以直接调用。另一个对扩展做了封装,可以更方便调用。具体用法看下面。
申请单个权限
- 和以前一样在清单文件申请权限,这里随便申请两个权限
<uses-permission android:name="android.permission.CAMERA"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
carme 和 write 就是这两个权限。
- 提前生成对象ActivityResultLauncher,两种用法看个人更喜欢哪种
//ktx 的用法val single = requestPermission(camera,granted = {//同意权限}, denied = {//拒绝权限}, explained = {//拒绝并且不再显示})
// dsl 用法, 更好用更省事val singleDsl = requestPermissionK(camera) {//有两种写法,个人更喜欢下面这种不用写=,两个都写只有一个生效//granted = {}granted { /*同意权限*/ }denied { /*拒绝权限*/ }explained { /*拒绝并且不再显示*/ }
- 调用
//调用// single.launch(camera)singleDsl.launch(camera)
申请多个权限
使用方法基本和上面类似,这次全部放在一起。
//ktx 写法val multiple = requestMultiplePermissions(allGranted = {//全部同意},denied = {//拒绝},explained = {//拒绝并不再显示})//dslval 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 优雅的实现页面传值
