57

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

我希望能够通过它自己的非活动类调用警报,但由于我没有扩展活动,我似乎没有任何“上下文”。这个概念让我很困惑,我已经阅读了 sdk 文档。

我将如何使用:

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

在我的非活动课上?

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

4

5 回答 5

43

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

无论如何,如果您想通过触发警报,AlarmManager我很确定警报应该继承自 aService或更好,并且在这种情况下,您可以通过orIntentService访问上下文this.getBaseContext()this.getApplicationContext()

于 2010-11-10T05:55:02.870 回答
20

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) {
  }
}
于 2010-11-10T05:52:15.850 回答
15

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

alarmTest = (AlarmManager)this.getContext().getSystemService(Context.ALARM_SERVICE);
于 2011-06-28T22:26:45.043 回答
4

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

于 2010-11-10T05:48:42.557 回答
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();
    }
}
于 2020-12-05T13:44:38.363 回答