Dagger2:如何解决JobService?

时间:2018-09-13 16:24:40

标签: android kotlin dagger-2 jobservice

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

现在,仍然有一个小陷阱:应用程序具有一个按钮,当按下该按钮时,必须安排工作服务。我可以重构作业服务,以便其依赖关系通过其构造函数传递,但是如何从活动中实例化它呢?换句话说,我该如何替换此代码:

    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)

那么实例化就降为匕首了?

谢谢!

1 个答案:

答案 0 :(得分:0)

您需要定义提供者:

@Provides
fun provideServiceComponent(app: Application): ComponentName =
        ComponentName(app, DbUpdaterJob::class.java) // assuming you have only one ServiceComponent


@Provides
fun provideJobInfo(
        serviceComponent: ComponentName
): JobInfo =
        JobInfo.Builder(DB_UPDATER_JOB_ID)
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE)
                .setPersisted(true)
                .build()
@Provides
@Singleton
fun provideJobScheduler(app: Application): JobScheduler = app.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler

然后注入

@Inject constructor(
        jobInfo: JobInfo,
        scheduler: JobScheduler
) {
    val res = scheduler.schedule(jobInfo)
            ...
}

如果您希望能够创建其他ComponentName或JobInfo等,它将变得更加复杂。在这种情况下,您需要使用@Named注入。