我正在构建一个通过AlarmManager触发警报的应用程序。
我希望能够通过它自己的非活动类来调用Alarm,但由于我没有扩展Activity,所以我似乎没有任何“上下文”。这个概念让我困惑,我读过sdk文档。
我将如何使用:
alarmTest = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
在我的非活动课上?
另外,我假设获取上下文将允许我在我的非活动类中使用SharedPrefs和Intents?
答案 0 :(得分:38)
您可以将上下文传递给非活动类,这是首选方法,或者您可以将应用程序的基本上下文封装到单例中,以允许您在应用程序内的任何位置访问上下文。在某些情况下,这可能是一个很好的解决方案,但在其他情况下,肯定不是一个好的解
无论如何,如果你想通过AlarmManager
触发警报,我很确定警报应该从Service
或更好地从IntentService
继承,在这种情况下,你有通过this.getBaseContext()
或this.getApplicationContext()
答案 1 :(得分:17)
Service
和Activity
继承自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();
}
}