2

我在 OnBootReceiver 中创建了一个警报,如下所示:

public class OnBootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
            Calendar cal = Calendar.getInstance();
            cal.add(Calendar.SECOND, 10);

            Intent i = new Intent(context, AlarmReceiver.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);

            AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), savedIntervalAutomaticMilisInt, pendingIntent);
    }
}

但要取消它,我在 Activity 中使用此代码:

Intent intent = new Intent(this, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.cancel(pendingIntent);
scManager.clearErrors();

所以要设置它,我使用 BroadcastReceiver 的 Context 参数中的上下文,但要取消它,我使用thisActivity 的上下文。我的问题:即使上下文略有不同,警报仍然会被取消吗?

4

2 回答 2

7

即使上下文略有不同,警报是否仍会被取消?

在这种情况下,上下文无关紧要——它只是一种到达AlarmManager.

PendingIntent.FLAG_CANCEL_CURRENT在取消警报逻辑中的选择可能会导致问题。如果您遇到困难(例如,adb shell dumpsys alarm表明您的警报在取消后幸存下来),请尝试替换PendingIntent.FLAG_CANCEL_CURRENT0.

于 2013-05-02T14:28:53.313 回答
1

尝试一下全局(应用程序范围)上下文对象:android.content.ContextWrapper.getApplicationContext()

于 2013-05-02T14:19:20.027 回答