Android:如何在AlarmService

时间:2016-02-24 18:37:39

标签: android

在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##的行中,contextnull。我该如何解决这个问题?

有趣的是,我在代码中修复了其他不起作用的东西。在修复之前(与其他事情相关),这种方式有效。但是现在,如何确保函数成为一个正确的“上下文”(无论如何,我仍然不能正确理解上下文是什么......)。

2 个答案:

答案 0 :(得分:1)

  

我该如何解决问题?

对于此特定问题,mContext始终为null,因为Android在向您发送广播时不会使用您的单参数构造函数。摆脱mContext,并使用传递给Context的{​​{1}}。

除此之外:

  • 我不知道你为什么要回来onReceive()

  • 我不知道你为什么要覆盖START_STICKYonStart(),因为onStartCommand()已在6 - 7年前被弃用

  • 我不知道为什么你在onStart()上使用SetAlarm()ClearAlarm()作为方法,迫使你创建一个Alarm然后扔掉它,而不是在服务上实现这些方法,或者将它们作为Alarm方法实现在某处

  • 你正在使用static,这很好,但除非你打算做的工作持续时间是亚毫秒,你真的需要使用RTC_WAKEUP模式,所以你做不要将应用程序的主要应用程序线程绑定在WakefulBroadcastReceiver中,也可以让设备保持唤醒状态

答案 1 :(得分:0)

而不是mContext,您应该使用context