web-dev-qa-db-ja.com

Dagger 2を使用してサービスに注入する

基本的には常に実行され、何かが発生するとユーザーに警告するサービスであるアプリがあります。

サービスがアラームを作成する場合、何かが発生したときにアラームがサービスに対してcallbacksできるように、contextを与える必要があります。

例えば:

public MyService extends Service{
    private SomeAlarm alarm;

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

SomeAlarmクラスをサービスに挿入し、SomeAlarmに変数としてサービスコンテキストを与えるにはどうすればよいですか?

26
Ofek Agmon

私は頭のてっぺんからコードを書いたので、タイプミスがあるかもしれません。

アクティビティに何かを注入するときと同じように行います。

  1. コンポーネントを宣言し、
  2. そのコンポーネントに注入メソッドを追加し、
  3. サービスを提供するモジュールを追加します
  4. そのコンポーネントビルダーを作成する
  5. モジュールをビルダーに追加します
  6. コンポーネントにサービスを注入します

モジュールとコンポーネントは次のようになります(おそらくスコープを追加します)

@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
private SomeAlarm alarm;

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

    alarm.doStuff();
}

これは、@Injectこのような注釈付きコンストラクタ:

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

それ以外の場合は、モジュールにアラーム作成を追加するだけです。

37
David Medenjak