在Android开发中,我们时常遇到以下几个问题:
- 当关闭当前界面时,数据回调到上一个界面,必须要在
onActivityResult
中处理,不能在调用的普通类中处理 - 当使用
Activity Result API
时,不用在onActivityResult
中处理了,但是必须要在Activity的STARTED
之前初始化,很多时候自己控制不好何时初始化 - Fragment中打开Activity,回调不走Fragment的
onActivityResult
(开发者使用错误造成)
其实这些,都是我们开发中很常见的,不管一个初级开发还是高级开发,都能解决这些问题,大不了面向百度编程,但是每一个人不可能都像我一样闲,把这些都总结在一起,很多道友估计都很忙,这时,我必须推荐一波,使用ActivityResultApi,而且支持ARouter回调,使用简单,通俗易懂!
API特色
- 优雅的适配Activity Result API,真正的支持在非Activity和Fragment中调用
- 支持不用在onResume()之前初始化ActivityResultLauncher
- 支持ARouter
- 支持Kotlin和Java用法
- Kotlin扩展,使用简单
如何使用
step 1.在根目录的build.gradle添加:
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
step 2.然后在 build.gradle(Module:XXX) 的 dependencies 添加:
dependencies {
implementation 'com.github.ChinaLike:ActivityResultApi:最新版本号'
//根据自己版本选择即可,最低不能低于activity-ktx:1.2.3、fragment-ktx:1.3.4
implementation("androidx.activity:activity-ktx:1.2.3")
implementation("androidx.fragment:fragment-ktx:1.3.4")
//ARouter,根据自己需要引入,版本按照自己需要引入
//implementation 'com.alibaba:arouter-api:1.5.2'
//kapt 'com.alibaba:arouter-compiler:1.5.2'
}
step 3.在项目自定义
Application
中添加或在已经有的自定义Application
的onCreate()
中添加:
class BaseApplication:Application() {
override fun onCreate() {
super.onCreate()
...
ActivityResultApi.init(this)
...
}
}
并在AndroidManifest.xml
中添加
<application
...
android:name=".BaseApplication"
...>
...
</application>
API介绍
registerForActivityResult(intent,activityResultCallback)
-
普通类使用,带接收回调数据和传递数据
-
参数说明
- intent:类型Intent,必传
- activityResultCallback:类型ActivityResultCallback,可选,当需要回调时传递,当不需要回调时,可不传递
-
Kotlin示例
-
接收返回数据
val intent = Intent(this, SecondActivity::class.java) intent.putExtra(Key.SOURCE, source) registerForActivityResult(intent) { //回调 }
-
不接收返回数据
val intent = Intent(this, SecondActivity::class.java) intent.putExtra(Key.SOURCE, source) registerForActivityResult(intent) //startActivity(intent) 也一样
-
-
Java示例
-
接收返回数据
Intent intent = new Intent(this, SecondActivity.class); intent.putExtra(Key.SOURCE, source); ActivityResultApiExKt.registerForActivityResult(this, intent, result -> //回调 );
-
不接收返回数据
Intent intent = new Intent(this, SecondActivity.class); intent.putExtra(Key.SOURCE, source); ActivityResultApiExKt.registerForActivityResult(this, intent);
-
<T:FragmentActivity> registerForActivityResult(intentExtra,activityResultCallback)
-
普通类使用,带接收回调数据和传递数据
-
参数说明
- intentExtra:类型(intent: Intent) -> Unit,可选
- activityResultCallback:类型ActivityResultCallback,可选,当需要回调时传递,当不需要回调时,可不传递
-
Kotlin示例
-
不传递数据但接收返回数据
registerForActivityResult<SecondActivity> { //回调 }
-
传递数据同时接收返回数据
registerForActivityResult<SecondActivity>({ it.putExtra(Key.SOURCE, source) }) { //回调 }
-
传递数据但不接收返回数据
registerForActivityResult<SecondActivity>({ it.putExtra(Key.SOURCE, source) })
-
不传递数据但不接收返回数据
registerForActivityResult<SecondActivity>()
-
navigation(context,navigationCallback,activityResultCallback)
-
结合ARouter中使用,跨模块调用
-
参数说明
- context:类型FragmentActivity或Fragment,必传
- navigationCallback:类型NavigationCallback,界面监听,可选
- activityResultCallback:类型ActivityResultCallback,回调,必传
-
Kotlin示例
-
带界面监听和接收返回数据
ARouter.getInstance() .build(Router.SECOND_ACTIVITY) .withString(Key.SOURCE, source) .navigation(this, object : NavigationCallback { override fun onFound(postcard: Postcard?) { } override fun onLost(postcard: Postcard?) { } override fun onArrival(postcard: Postcard?) { } override fun onInterrupt(postcard: Postcard?) { } }) { //回调 }
-
不带界面监听但接收返回数据
ARouter.getInstance() .build(Router.SECOND_ACTIVITY) .withString(Key.SOURCE, source) .navigation(this) { //回调 }
-
-
Java示例
-
带界面监听和接收返回数据
Postcard postcard = ARouter.getInstance() .build(Router.SECOND_ACTIVITY) .withString(Key.SOURCE, source); ActivityResultApiExKt.navigation(postcard, this, new NavigationCallback() { @Override public void onFound(Postcard postcard) { } @Override public void onLost(Postcard postcard) { } @Override public void onArrival(Postcard postcard) { } @Override public void onInterrupt(Postcard postcard) { } }, new ActivityResultCallback<ActivityResult>() { @Override public void onActivityResult(ActivityResult result) { //回调 } });
不带界面监听但接收返回数据
Postcard postcard = ARouter.getInstance() .build(Router.SECOND_ACTIVITY) .withString(Key.SOURCE, source); ActivityResultApiExKt.navigation(postcard, this, new ActivityResultCallback<ActivityResult>() { @Override public void onActivityResult(ActivityResult result) { //回调 } });
-
最后
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
一、面试合集
image 二、源码解析合集 image 三、开源框架合集 image私信获取文中籽料~
网友评论