栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

前言

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

在这个大环境下,想必很多人也会把新项目或者升级老项目使用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'
}
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);
registerForActivityResult(intentExtra,activityResultCallback) 参数说明

intentExtra:类型(intent: Intent) -> Unit,可选activityResultCallback:类型ActivityResultCallback,可选,当需要回调时传递,当不需要回调时,可不传递 Kotlin示例

不传参,有回调

registerForActivityResult {
   //回调
}

传参,有回调

registerForActivityResult({
   it.putExtra(Key.SOURCE, source)
}) {
   //回调
}

传参,没有回调

registerForActivityResult({
   it.putExtra(Key.SOURCE, source)
})

不传参,没有回调

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

    @Override
    public void onActivityResult(ActivityResult result) {
        //回调
    }
});

不带界面监听但有回调

Postcard postcard = ARouter.getInstance()
        .build(Router.SECOND_ACTIVITY)
        .withString(Key.SOURCE, source);
ActivityResultApiExKt.navigation(postcard, this, new ActivityResultCallback() {

    @Override
    public void onActivityResult(ActivityResult result) {
        //回调
    }
});

如有问题欢迎留言源码地址

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/786068.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号