美文网首页
有了它,再也不用担心把Activity或Fragment返回数据

有了它,再也不用担心把Activity或Fragment返回数据

作者: 蜗牛是不是牛 | 来源:发表于2023-02-13 09:28 被阅读0次

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

    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

    私信获取文中籽料~

    相关文章

      网友评论

          本文标题:有了它,再也不用担心把Activity或Fragment返回数据

          本文链接:https://www.haomeiwen.com/subject/dmpdkdtx.html