在android(作为初学者)中,我创建了一个AlarmService
类来充当服务,即在后台运行每个固定的时间间隔,以检查数据并可能通知用户某些事情正在发生。
AlarmService
类的定义如下:
public class AlarmService extends Service
{
Alarm alarm = new Alarm(this);
public void onCreate()
{
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
alarm.SetAlarm(this);
return START_STICKY;
}
@Override
public void onStart(Intent intent, int startId)
{
alarm.SetAlarm(this);
}
@Override
public IBinder onBind(Intent intent)
{
return null;
}
}
,实际的Alarm
实现如下:
public class Alarm extends BroadcastReceiver
{
private Context mContext;
public final static String LOGHEAD = "StoxxAlarm";
public Alarm() {
mContext = null;
}
public Alarm(Context context) {
mContext = context;
}
@Override
public void onReceive(Context context, Intent intent)
{
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(mContext);
int updateInterval = Integer.parseInt(sharedPref.getString("updateInterval", "24")); // ##PROBLEM##
// ... do something here
}
public void SetAlarm(Context context)
{
// get the update cylce from the prefences
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(mContext);
int updateInterval = Integer.parseInt(sharedPref.getString("updateInterval", "24"));
AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, Alarm.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 60 * updateInterval, pi); // Millisec * Second * Minute
}
public void CancelAlarm(Context context)
{
Intent intent = new Intent(context, Alarm.class);
PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(sender);
}
}
问题出现在标有##PROBLEM##
的行中,context
为null
。我该如何解决这个问题?
有趣的是,我在代码中修复了其他不起作用的东西。在修复之前(与其他事情相关),这种方式有效。但是现在,如何确保函数成为一个正确的“上下文”(无论如何,我仍然不能正确理解上下文是什么......)。
答案 0 :(得分:1)
我该如何解决问题?
对于此特定问题,mContext
始终为null
,因为Android在向您发送广播时不会使用您的单参数构造函数。摆脱mContext
,并使用传递给Context
的{{1}}。
除此之外:
我不知道你为什么要回来onReceive()
我不知道你为什么要覆盖START_STICKY
和onStart()
,因为onStartCommand()
已在6 - 7年前被弃用
我不知道为什么你在onStart()
上使用SetAlarm()
和ClearAlarm()
作为方法,迫使你创建一个Alarm
然后扔掉它,而不是在服务上实现这些方法,或者将它们作为Alarm
方法实现在某处
你正在使用static
,这很好,但除非你打算做的工作持续时间是亚毫秒,你真的需要使用RTC_WAKEUP
模式,所以你做不要将应用程序的主要应用程序线程绑定在WakefulBroadcastReceiver
中,也可以让设备保持唤醒状态
答案 1 :(得分:0)
而不是mContext
,您应该使用context