Android Hilt实现依赖注入

修改上一个demo, 使用Hilt实现单例对象注入到activity。

新建Application,加上HiltAndroidApp注解:

Kotlin 复制代码
package com.example.testnavigation

import android.app.Application
import dagger.hilt.android.HiltAndroidApp

@HiltAndroidApp // HiltAndroidApp 注解会自动生成 Hilt 组件,并自动注入依赖
class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
    }
}

修改EventBus, 使用注解生成单例对象:

Kotlin 复制代码
package com.example.testnavigation

import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.launch
import javax.inject.Inject
import javax.inject.Singleton

/**
 * SharedFlow 事件总线(单例,全局唯一)
 */
class EventBus @Inject constructor() { // @Inject 让 Hilt 构造
    private val _events = MutableSharedFlow<Any>(replay = 0, extraBufferCapacity = 10)

    val events: SharedFlow<Any> = _events

    private val scope = CoroutineScope(Dispatchers.IO)

    /**
     * 发送事件
     */
    fun post(event: Any) {
        scope.launch {
            _events.emit(event) // 发射事件
        }
    }
}

// 提供单例
@Module // 标记为 Hilt 模块, 专门用来提供第三方类、接口、无构造函数类的实例
@InstallIn(SingletonComponent::class) // 把这个模块安装到app整个生命周期。SingletonComponent:整个App全局单例
object AppModule {
    @Provides // 提供一个对象实例
    @Singleton
    fun provideEventBus(): EventBus { // 提供eventBus单例
        return EventBus()
    }
}

修改MainActivity:

Kotlin 复制代码
package com.example.testnavigation

import android.content.Intent
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.fragment.app.FragmentActivity
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import javax.inject.Inject

@AndroidEntryPoint  // 注入点,可以被注入对象
class MainActivity : FragmentActivity() {
    // 直接注入
    @Inject // 直接注入对象
    lateinit var eventBus: EventBus

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main1)
        findViewById<Button>(R.id.btn_goto_second).setOnClickListener {
            startActivity(Intent(this@MainActivity, MainActivity2::class.java))
        }

        eventBus.events
            .filter { it is MessageEvent }
            .onEach { event ->
                val msg = event as MessageEvent
                println("收到消息:${msg.content}")
                val tv_msg = findViewById<TextView>(R.id.tv_msg)
                tv_msg.text = msg.content
            }
            .launchIn(CoroutineScope(Dispatchers.Main))
    }
}

同样,修改第二个activity:

Kotlin 复制代码
package com.example.testnavigation

import android.os.Bundle
import android.widget.Button
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.lifecycleScope
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import javax.inject.Inject

@AndroidEntryPoint
class MainActivity2: FragmentActivity() {
    @Inject
    lateinit var eventBus: EventBus

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_2)
        findViewById<Button>(R.id.btn_send_event).setOnClickListener {
            eventBus.post(MessageEvent("肃清万里,总齐八荒。"))
            lifecycleScope.launch {
                delay(1000)
                finish()
            }
        }
    }
}

运行:

点击跳转到第二个activity:

点击发送数据:

ok. 除此以外,viewModel也能注入,略。

相关推荐
驰骋工作流4 小时前
流程时效考核的表结构:从待办时限到 WF_CH 考核结果驰骋BPM驰骋低代码低代码工作流引擎
android·低代码·rxjava
传奇开心果编程6 小时前
【Flutter踩坑排雷】第7课:巨型 build 函数坑|全部 UI 写在同一个 build,维护难、隐性异常
android·flutter·ios·移动开发·跨平台·dart·声明式ui
方白羽10 小时前
Android 双开环境底层剖析与风控检测落地
android·安全·app
weixin_5633714710 小时前
Android Studio 2024 版 Device Explorer 打开方法
android·ide·android studio
AIsoft_868913 小时前
职场音频文件怎么整理?录音APP有哪些用法
android·音视频
booboosui13 小时前
第一批个人 Agent 用户正在卸载,问题不在模型,在它住在哪儿
android
洞见前行13 小时前
点击图标到内容出现,你的 App 在这几秒里做了什么:Android 冷启动全链路优化实战
android·性能优化·android studio
凯基迪科技13 小时前
芯片UID绑定修改 加密与逆向修改思路分析
android
Liben14 小时前
Weex开发踩坑记录
android·前端·ios
救救孩子把16 小时前
结构化输出为何“格式正确、答案错误”?JSON Schema 的能力边界
android·java·json·agent·agent服务