无法在Android中使用AlarmManager停止服务

时间:2017-01-10 03:35:12

标签: java android alarmmanager android-alarms

我有一个警报管理器启动服务的代码。我必须使用第二个警报在指定的时间取消它。没有一个我看过的解决方案。我的代码如下:

 void startAtInterval(int fromTime, int fromTimeMinute, int toTime, int toTimeMinute, int id1, int id2) {
    // start alarm

    AlarmManager alarmMgr = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
    PendingIntent alarmIntent = PendingIntent.getService(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, fromTime);
    calendar.set(Calendar.MINUTE, fromTimeMinute);

    alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
            AlarmManager.INTERVAL_DAY, alarmIntent);

    // stop alarm

  AlarmManager alarmMgr1 = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
    PendingIntent alarmIntent1 = PendingIntent.getService(getApplicationContext(), 1, intent, PendingIntent.FLAG_CANCEL_CURRENT);

    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTimeInMillis(System.currentTimeMillis());
    calendar1.set(Calendar.HOUR_OF_DAY, toTime);
    calendar1.set(Calendar.MINUTE, toTimeMinute);

    alarmMgr1.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar1.getTimeInMillis(),
            AlarmManager.INTERVAL_DAY, alarmIntent1);
    stopService(intent);

        alarmMgr1.cancel(alarmIntent1);

}

我使用了FLAG_UPDATE_CURRENTFLAG_CANCEL_CURRENT。当我在代码中显示时,我也尝试stopservice。我正在从配置屏幕上抽出时间。我知道它有效,因为第一次警报总是被触发。

2 个答案:

答案 0 :(得分:0)

要停止任何警报管理器,您必须使用它:

Intent intentS = new Intent(ctx,YourService.class);
            intentS.addCategory("SOMESTRING_AS_TAG");
            PendingIntent senderS = PendingIntent.getService(ctx, NDX, intentS, PendingIntent.FLAG_CANCEL_CURRENT);
            am.cancel(senderS);
            senderS.cancel();

    //and  this
        PendingIntent senderSNew = PendingIntent.getService(ctx, NDX, intentS, 0);
        am.cancel(senderSNew);
        senderSNew.cancel();

其中NDX与已启动相同。在你的情况下,这是0。或者,更好的是,将NDX更改为一些随机的数字。

停止:

Intent intent = new Intent(ctx,YourService.class);
    intent.addCategory("SOMESTRING_AS_TAG");
    ctx.stopService(intent);

答案 1 :(得分:0)

你应该有第二个警报取消服务,然后BroadcastReceiver停止服务。这将确保警报在任何情况下都能成功停止服务,例如应用程序被关闭。

AlarmManager alarmMgr1 = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
Intent intentCancelService= new Intent(getApplicationContext(), StopServiceReceiver.class);
PendingIntent alarmIntent1 = PendingIntent.getBroadcast(getApplicationContext(), StopServiceReceiver.REQUEST_CODE, intentCancelService, PendingIntent.GoTestAlarmReceiver);

Calendar calendar1 = Calendar.getInstance();
calendar1.setTimeInMillis(System.currentTimeMillis());
calendar1.set(Calendar.HOUR_OF_DAY, toTime);
calendar1.set(Calendar.MINUTE, toTimeMinute);

alarmMgr1.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar1.getTimeInMillis(),
        AlarmManager.INTERVAL_DAY, alarmIntent1);

然后制作BroadcastReceiver

public class GoTestAlarmReceiver extends BroadcastReceiver {
    public static final int REQUEST_CODE = 123123;  //whatever code just unique

@Override
public void onReceive(Context context, Intent intent) {
    Intent i = new Intent(context, YourServiceClassHere.class);
    context.stopService(i);
    }
}

确保在清单中声明接收方:

<receiver
        android:name=".StopServiceReceiver"
        android:enabled="true"
        android:process=":remote" />