web-dev-qa-db-ja.com

非アクティビティクラスでgetSystemServiceを使用する方法

AlarmManagerを介してアラームをトリガーするアプリケーションを構築しています。

独自の非アクティビティクラスを介してアラームを呼び出すことができますが、アクティビティを拡張していないため、「コンテキスト」が表示されません。この概念は私を混乱させ、sdkのドキュメントを読みました。

どのように使用しますか:

alarmTest = (AlarmManager)getSystemService(Context.ALARM_SERVICE);

私の非活動クラスで?

また、コンテキストを取得すると、非アクティビティクラスでもSharedPrefsとIntentsを使用できるようになると思いますか?

52
eportermd

コンテキストを非アクティビティクラスに渡すことができます。これは、好ましい方法です。または、アプリケーションのベースコンテキストをシングルトンにカプセル化して、アプリケーション内のどこからでもコンテキストにアクセスできます。いくつかのケースではこれは良い解決策かもしれませんが、他のケースでは確かに良い解決策ではありません。

とにかく、AlarmManagerを介してアラームをトリガーする場合、アラームはServiceから継承するか、IntentServiceから継承する必要があります。そのような場合は、this.getBaseContext()またはthis.getApplicationContext()

39
Marek Szanyi

ServiceActivityContextから継承します。したがって、これらのクラスでgetSystemServiceを呼び出すときは、実際にsuper.getSystemService

別のクラスでContextを使用できるようにする場合は、そのクラスのメソッドに引数として渡すことができます。また、参照を保持することもできます。

編集:サンプルコード。しかし、真剣に、それはextremely基本です-継承とメソッドを理解している場合。

class MyActivity extends Activity { // Activity extends Context, so MyActivity also extends Context
  void someMethod() {
    MyOtherClass.useStaticContext(this);
    MyOtherClass instance = new MyOtherClass();
    instance.useInstanceContext(this.getApplicationContext());
  }
}
class MyOtherClass {
  static void useStaticContext(Context context) {
  }
  void useInstanceContext(Context context) {
  }
}
17
Jean Hominal

以下を試すことができます。ビューが実行されている現在のコンテキストを取得できます。

alarmTest = (AlarmManager)this.getContext().getSystemService(Context.ALARM_SERVICE);
13
Kevin Parker

コンテキストを非アクティビティクラスに渡す必要があります。

4
Ryan Reeves