android - 使用 Dagger 2 注入(inject)服务

标签 android dependency-injection android-service inversion-of-control dagger-2

我有一个应用程序,它基本上是一项服务,它始终运行并在发生某些事情时向用户发出警报。

当服务创建警报时,它需要给它自己的context,以便警报可以在发生事情时对服务进行回调

例如:

public MyService extends Service{
    private SomeAlarm alarm;

    @Override
    public void onCreate() {
        super.onCreate();
        alarm = new SomeAlarm(MyService.this);
    }
}

如何将 SomeAlarm 类注入(inject)到服务中,并将服务上下文作为变量赋予 SomeAlarm

最佳答案

我是从头顶写的代码,所以可能有一两个错字。

您的操作与将内容注入(inject) Activity 时一样。

  1. 声明一个组件,
  2. 将注入(inject)方法添加到该组件,
  3. 添加提供服务的模块
  4. 创建组件构建器
  5. 将您的模块添加到构建器中
  6. 使用组件注入(inject)您的服务

您的模块和组件看起来像这样(可能会添加一些范围)

@Module
class ServiceModule {

    MyService mService;

    ServiceModule(MyService service) {
        mService = service;
    }

    @Provides
    MyService provideMyService() {
        return mService;
    }
}

@Component(modules=ServiceModule.class)
interface MyServiceComponent {
    void inject(MyService service);
}

然后在 onCreate 中创建您的组件并注入(inject)您的警报。

@Inject
private SomeAlarm alarm;

public void onCreate() {
    DaggerMyServiceComponent.builder()
            .serviceModule(new ServiceModule(this))
            .build()
            .inject(this);

    alarm.doStuff();
}

这是假设您的警报可以通过具有 @Inject 带注释的构造函数注入(inject)构造函数,如下所示:

class SomeAlarm {
    @Inject
    SomeAlarm(MyService service) {
        /*constructor stuff*/
    }
}

否则,您也只需将警报创建添加到您的模块中。

关于android - 使用 Dagger 2 注入(inject)服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37052261/

相关文章:

gwt - 将用户类添加到所有演示者

java - 如何在spring boot中使用应用程序上下文获取bean

c# - 统一: No parameterless constructor defined for this object.

android - 为什么后台服务运行时会停止?

android - 无法恢复 Activity : not allowed to start service Intent, 应用程序在后台

javascript - 从 JavaScript 在 WebView 中播放声音

android - 执行doInBackground()时出现java.lang.RuntimeException错误如何解决?

Android 房间数据库删除不起作用?

android - 如何为音乐播放器的播放暂停服务

android - 在 android 中记录通话为什么这不起作用