Kotlin Common篇之七 ARouter

作者: super_shanks | 来源:发表于2019-06-19 14:24 被阅读12次

    首发于公众号: DSGtalk1989

    先依赖,具体版本号见ARouter GitHub(https://github.com/alibaba/ARouter)

    //ARouter
      implementation "com.alibaba:arouter-api:${arouter_api_versoion}"
      kapt "com.alibaba:arouter-compiler:${arouter_compiler_versoion}"
    
    

    我们一般会把路由放在一个统一的地方进行管理,比如ARouterAddress.kt

    /**
       * 路由地址管理
       */
      object ARouterAddress {
          const val DemoActivity = "/demo/activity"
      }
    
    

    在相应的Activity上加上路由注解

    @Route(path = ARouterAddress.DemoActivity)
    class DemoActivity : AppCompatActivity() {
    }
    
    

    onCreate方法中注入路由

    override fun onCreate(savedInstanceState: Bundle?) {
          ARouter.getInstance().inject(this)  // Start auto inject.
          super.onCreate(savedInstanceState)
    }
    
    

    页面中需要传入的一些intent元素的定义

    @Autowired
    @JvmField
    var userName = ""
    
    

    @Autowired,自动装配的意思,ARouter中专门用来注解intent元素的注解。

    @JvmField需要多说明一下。在kotlin中,我们的属性最终经过编译都是private的,只提供了gettersetter,具体可见Kotlin 类和对象(http://www.runoob.com/kotlin/kotlin-class-object.html)。但是在某些需要使用到反射或者其他的情况下,我们需要属性是public的。这时候我们就用@JvmField去标注它,那么编译出来的属性就是public的。

    那么为了使这两个注解可以直接生效,我们需要手动的在onCreate方法中做inject操作。

    override fun onCreate(savedInstanceState: Bundle?) {
          super.onCreate(savedInstanceState)
          ARouter.getInstance().inject(this)
    }
    
    

    考虑到这种情况,一旦Activity或者Fragment中有@Autowired注解的属性,我们直接实现某个指定空接口ARouterInjectable,然后我们进行lifeCycle注册,在生命周期的回调中做方法处理,具体如下。

    object ARouterManager {
          fun init(app: Application) {
              ///初始化路由
              if (BuildConfig.DEBUG) {
                  ARouter.openLog()
                  ARouter.openDebug()
              }
              ARouter.init(app)
              app.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks {
                  override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
                      handleActivity(activity)
                  }
    
                  override fun onActivityStarted(activity: Activity) {
    
                  }
    
                  override fun onActivityResumed(activity: Activity) {
    
                  }
    
                  override fun onActivityPaused(activity: Activity) {
    
                  }
    
                  override fun onActivityStopped(activity: Activity) {
    
                  }
    
                  override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle?) {
    
                  }
    
                  override fun onActivityDestroyed(activity: Activity) {
    
                  }
              })
          }
    
          private fun handleActivity(activity: Activity) {
              if (activity is ARouterInjectable) {
                  ///注入ARouter参数
                  ARouter.getInstance().inject(activity)
              }
              if (activity is FragmentActivity) {
                  activity.supportFragmentManager.registerFragmentLifecycleCallbacks(
                      object : FragmentManager.FragmentLifecycleCallbacks() {
                          override fun onFragmentCreated(
                              fm: FragmentManager,
                              f: Fragment,
                              savedInstanceState: Bundle?
                          ) {
                              if (f is ARouterInjectable) {
                                  ///注入ARouter参数
                                  ARouter.getInstance().inject(f)
                              }
                          }
                      }, true
                  )
              }
          }
      }
    
    

    然后直接在applicationonCreate方法中初始化即可

    其实我们可以更省力,直接通过属性注解判断即可,连ARouterInjectable都不需要去实现,但是相比消耗可能会更大

    使用静态方法,跳转到路由界面。kotlin中使用伴生对象实现

    companion object {
          fun goToDemo(userName : String){
              ARouter.getInstance().build(ARouterAddress.DemoActivity)
                  .withString("userName", userName).navigation()
          }
      }
    

    相关文章

      网友评论

        本文标题:Kotlin Common篇之七 ARouter

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