AAC学习笔记Dagger(二)--Activity注入之前

本文深入探讨了在Android应用中如何使用Dagger进行Activity的注入,从Application开始,逐步解析了AppInjector、DispatchingAndroidInjector的角色和工作原理,并通过实例展示了如何为多个Activity添加注入。最后,总结了在实际项目中注入Activity的便利性和源码学习的价值。
摘要由CSDN通过智能技术生成

本文为《Android Architecture Components学习笔记》的一部分
文档代码为Kotlin,但是系统生成的代码仍然为Java
为了方便理解,我将官方示例做了逐步拆解
本人水平有限,如有不当之处请不吝赐教


上一篇分析了Dagger的基本使用方法,还是很弱爆的。在项目里如何应用呢,本篇捋一下Activity对象注入的那些事。


Application

说明一下GithubApp这个类,在AndroidManifest里:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    ……
    <application
        android:name=".GithubApp"
        ……

android:name属性是用来设置所有activity属于哪个application的
GithubApp这个类放的是全局成员,代码中的AppInjector.init(this)在activity之前执行
AppInjector.init(this)也是所有注入的开始。

第一步,跟上篇一样先看注入者GithubApp

//需要实现HasActivityInjector
class GithubApp : Application(), HasActivityInjector {
   
    @Inject
    lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>
    
    override fun onCreate() {
   
       ……
       //重写了onCreate(),此句是重点
       AppInjector.init(this)
    }
    override fun activityInjector() = dispatchingAndroidInjector
}

第二步,Component:

@Component(modules = [AndroidInjectionModule::class])
interface AppComponent {
   
    //此处声明了Builder
    @Component.Builder
    interface Builder {
   
        @BindsInstance
        fun application(application: Application): Builder
        fun build(): AppComponent
    }
    fun inject(githubApp: GithubApp)
}

build后GithubApp_MembersInjectorDaggerAppComponent就出来了
GithubApp 是Application,所以这里实现了HasActivityInjector,从而能够实现Activity的注入
这里还有一个很重要的类:DispatchingAndroidInjector。后面会详细说

AppInjector(一)

object AppInjector {
   
    fun init(githubApp: GithubApp) {
   
        //第一句:完成对githubApp的注入
        DaggerAppComponent.builder().application(githubApp).build().inject(githubApp)
        //第二句:override onActivityCreated,加入handleActivity
        githubApp.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks {
   
                override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
   handleActivity(activity)}
        })
    }
    private fun handleActivity(activity: Activity)  {
   ...}//为了好看,这里先收起来
}

先看AppInjector.init第一句:

    DaggerAppComponent.builder()//通过此静态方法得到Builder
 	                  .application(githubApp)//包含githubApp的Builder
 			          .build()//得到DaggerAppComponent对象
 			          .inject(githubApp)

这里用到的DaggerAppComponent几个方法:

public 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值