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也能注入,略。

相关推荐
freshman_y2 小时前
Qtcreator怎么新建安卓项目?编写一个五子棋游戏APP?
android·qt
时寒的笔记3 小时前
js逆向7_案例惠nong网
android·开发语言·javascript
肯多洛夫斯基4 小时前
安卓工控屏静默连WiFi全攻略
android
极梦网络无忧4 小时前
Android无障碍服务实现抖音直播间界面监控(场控助手核心原理)
android
call me by ur name5 小时前
ERNIE 5.0 Technical Report论文解读
android·开发语言·人工智能·机器学习·ai·kotlin
kerli5 小时前
Compose 组件:Box 核心参数及其 Bias 算法
android·前端
BLUcoding6 小时前
Android 常用控件及核心属性
android
遥不可及zzz6 小时前
[特殊字符] Android AAB 一键安装工具配置指南
android·macos
私人珍藏库6 小时前
【Android】一键硬核锁手机
android·智能手机·app·工具·软件