Dagger2:如何解决 JobService?

Lui*_*reu 2 android kotlin dagger-2 jobservice

我正在尝试更新我的简单 android 应用程序以使用 Dagger2。我想我已经设法理解了一些基础知识,并且正在通过它创建基本的东西(活动、视图模型、助手)。

现在,还有一个小问题:该应用程序有一个按钮,按下该按钮后,必须安排作业服务。我可以重构我的 jobservice 以便它的依赖项通过它的构造函数传递,但是我如何从我的活动中实例化它?换句话说,我如何替换此代码:

    val serviceComponent = ComponentName(getApplication(), DbUpdaterJob::class.java)
    var jobInfo = JobInfo.Builder(DB_UPDATER_JOB_ID, serviceComponent)
            .setRequiredNetworkType(networkType)
            .setPersisted(true)
            .build()

    val scheduler = getApplication<Application>().getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
    val res = scheduler.schedule(jobInfo)
Run Code Online (Sandbox Code Playgroud)

所以实例化被降级为匕首?

谢谢!

Lui*_*reu 5

经过一番挖掘,它最终比我想象的要容易......所以,我为我的工作绑定创建了一个新模块:

@Module
abstract class JobBindingModule {
    @ServiceScoped
    @ContributesAndroidInjector
    internal abstract fun provideDbUpdatedJob(): DbUpdaterJob
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,ServiceScoped 是一个新的注释,如下所示:

@Scope
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE, ElementType.METHOD)
annotation class ServiceScoped
Run Code Online (Sandbox Code Playgroud)

我已将该模块添加到我的 dagger 组件模块集合中。之后,我用属性注入替换了构造函数参数注入:

class DbUpdaterJob: JobService() {
    @Inject
    lateinit var dbManager: NewsManager
Run Code Online (Sandbox Code Playgroud)

最后,我重写了onCreate注入所需依赖项的方法:

override fun onCreate() {
    super.onCreate()
    AndroidInjection.inject(this)
}
Run Code Online (Sandbox Code Playgroud)

它似乎正在工作......