14

私は基本的に何かが起きたときにいつも稼働し、ユーザーに警告するサービスを持っているアプリを持っています。ダガー2を使ってサービスに入れる

サービスがアラームを作成するときに、何かが発生したときにアラームがコールバックを行うように、彼にcontextを与える必要があります。例えば

私はサービスに SomeAlarmクラスを注入し、変数として SomeAlarmサービスコンテキストを与えることができますどのように
public MyService extends Service{ 
    private SomeAlarm alarm; 

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

+3

なぜdownvoteすべきですか?ビルダ()(大文字B) を呼んでいたことが判明しましたか –

答えて

17

私は頭の上からコードを書いたので、タイプミスまたは2つのミスがあります。

アクティビティにスタッフを注入するときとまったく同じです。

  1. コンポーネントビルダー
  2. はビルダー
  3. 注入するあなたのモジュールを追加することを作成し、あなたのサービスを提供するモジュールを追加
  4. 、そのコンポーネントにインジェクトメソッドを追加
  5. 、コンポーネントを宣言コンポーネントを使用したサービス

モジュールとコンポNENTは自分のコンポーネントを作成onCreate

@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); 
} 

その後(おそらくいくつかのスコープを追加)したり、アラームを注入、このようになります。

@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*/ 
    } 
} 

は、あなただけのも、あなたのモジュールにアラームの作成を追加します。

+2

あなたの答えに感謝します。私がアラームを注入しようとしているときに "ビルダー(ビルダー)がビルダーで私的アクセス権を持っている"と言ってコンパイルするコードがありません –

+0

@OfekAgmonこれは私の答えの最初の行を追加した理由です。これは 'DaggerMyServiceComponent.builder()'です。 –

+0

ありがとう、DaggerMyServiceComponent.builder()の前に "new"を取り出す必要もありました –

0

は、同様の問題を持っていた私は、正しいものはビルダー(小文字のb)の