前言
在安卓开发中,跳转和申请权限设计的比较麻烦,网上有很多优秀的库解决这个问题,谷歌对这个问题做了处理,废弃了以前的方法。具体的使用方法可以参考末尾的参考博客。下面是对这些方法做的基本封装,方便使用。
IntentKtx
这个类是对普通跳转的封装,可以用也可以不用,主要是方便实现简单的跳转。都是扩展函数,直接在 Activity/Fragment 中使用即可。
intentOf :专门用来生成不同类型的 Intent
createIntent :生成Intent并添加参数(可选)
createIntentStart :生成跳转的Intent并添加参数,也可以不添加参数
addPair :Intent 添加参数
startActivityK :跳转
browse :打开浏览器
share :生调用分享,只能分享文本
email :发送邮件
makeCallPermission :拨打电话,需要权限
makeCall :拨打电话
sendSMS :发送短信
封装使用界面跳转
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.跳转使用
- 第一步生成 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()
}
}
}
- 第二步调用跳转
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 = {
//拒绝并不再显示
}
)
//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 优雅的实现页面传值