如何在非活动类中使用getSystemService?

epo*_*rmd 54 android android-context

我正在构建一个通过AlarmManager触发警报的应用程序.

我希望能够通过它自己的非活动类来调用Alarm,但由于我没有扩展Activity,所以我似乎没有任何"上下文".这个概念让我困惑,我读过sdk文档.

我将如何使用:

alarmTest = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Run Code Online (Sandbox Code Playgroud)

在我的非活动课上?

此外,我假设获取上下文将允许我在我的非活动类中使用SharedPrefs和Intents?

Mar*_*nyi 40

您可以将上下文传递给非活动类,这是首选方法,也可以将应用程序的基本上下文封装到单例中,以允许您在应用程序内的任何位置访问上下文.在某些情况下,这可能是一个很好的解决方案,但在其他情况下,肯定不是一个好的解

无论如何,如果你想通过AlarmManager我触发警报,我很确定警报应该从一个Service或更好的方式继承IntentService,在这种情况下你可以通过this.getBaseContext()或者访问上下文this.getApplicationContext()

  • 是否建议传递上下文?这不会导致上下文泄漏吗? (2认同)

Jea*_*nal 18

ServiceActivity继承自Context- 所以当你getSystemService在这些课堂上打电话时,你真的在​​打电话super.getSystemService.

如果你想Context在另一个类中有一个可用的,你可以将一个作为参数传递给该类的方法,保持对它的引用,等等.

编辑:代码示例.但严重的是,它是非常基础的 - 如果你了解继承和方法.

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) {
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 我想我明白你的意思.您是否碰巧知道我在哪里可以找到回购中的示例代码?谢谢! (2认同)

Kev*_*ker 13

您可以尝试以下操作,它允许您获取视图正在运行的当前上下文.

alarmTest = (AlarmManager)this.getContext().getSystemService(Context.ALARM_SERVICE);
Run Code Online (Sandbox Code Playgroud)