Skip to content

ChinaLike/ActivityResultApi

Repository files navigation

ActivityResultApiKx

API Gradle-4.1.2

官方已明确标记startActivityForResult()@deprecated,并给出@link指定使用registerForActivityResult,即Activity Result API,下面我们来看一张图:

QQ20220318-100841@2x.png 在这个大环境下,想必很多人也会把新项目或者升级老项目使用Activity Result API,如果还未使用或者想使用的人可以先了解一下Activity Result API的基础使用,但是使用的人知道存在以下几个问题:

  • java.lang.IllegalStateException: LifecycleOwner XXXX is attempting to register while current state is RESUMED. LifecycleOwners must call register before they are STARTED.

  • ARouter不支持Activity Result API(目前不支持,不代表以后不支持)

基于以上问题,本文给出了解决方案

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中添加或在已经有的自定义ApplicationonCreate()中添加:

class BaseApplication:Application() { override fun onCreate() { super.onCreate() ... ActivityResultApi.init(this) ... } } 

并在AndroidManifest.xml中添加

 <application ... android:name=".BaseApplication" ...> ... </application> 

API介绍

  • 此SDK支持不回调,当不需要回调的时候,使用我们平时的startActivity()也是一样的,按照自己习惯选择即可
  • 当没有Java示例的地方,说明不支持或者使用Java非常麻烦

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>() 

ARouter中,navigation(context,navigationCallback,activityResultCallback)

参数说明

  • 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) { //回调 } }); 

About

Activity Result API 扩展,解决before they are STARTED,支持ARouter

Topics

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors