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

No packages published
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy