本文为《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_MembersInjector
、DaggerAppComponent
就出来了
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