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

时间:2010-11-10 05:40:59

标签: android android-context

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

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

我将如何使用:

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

在我的非活动课上?

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

5 个答案:

答案 0 :(得分:38)

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

无论如何,如果你想通过AlarmManager触发警报,我很确定警报应该从Service或更好地从IntentService继承,在这种情况下,你有通过this.getBaseContext()this.getApplicationContext()

访问上下文

答案 1 :(得分:17)

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) {
  }
}

答案 2 :(得分:12)

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

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

答案 3 :(得分:4)

您需要将上下文传递给非活动类。

答案 4 :(得分:0)

使用此 在活动中:

private Context context = this;

........
if(Utils.isInternetAvailable(context){
Utils.showToast(context, "toast");
}
..........

在实用程序中:

public class Utils {

    public static boolean isInternetAvailable(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        return cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected();
    }

    public static void showToast(Context context, String text) {
        Toast toast = Toast.makeText(context, text, Toast.LENGTH_SHORT);
        toast.setGravity(Gravity.CENTER, 0, 0);
        toast.show();
    }
}