从其他活动中停止alarmManager

时间:2015-08-01 20:38:17

标签: android

我试图通过Map活动中的onBackPressed()方法停止MainActivity中的alarmManager。我已经尝试了下面的代码,但是alarmManager没有被停止并且仍在触发。我该如何解决?

MainActivity中的代码:

Intent intent = new Intent(MainActivity.this, GetLLRD.class);
intent.putExtra("json_data", json);
PendingIntent pendingIntent = PendingIntent.getService(
        getApplicationContext(), 123, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Calendar cal = Calendar.getInstance();
alarm.setRepeating(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis(), 20 * 1000, pendingIntent);
startService(intent);

地图活动中的代码:

@Override
public void onBackPressed() {       
    Intent intent = new Intent(Map.this, MainActivity.class);
    PendingIntent pendingIntent = PendingIntent.getService(
            getApplicationContext(), 123, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarm.cancel(pendingIntent);
}

2 个答案:

答案 0 :(得分:2)

问题是你使用两个不同的类来创建和停止警报:

Intent intent = new Intent(context,
                    GetLLRD.class);

Intent intent = new Intent(context,
                    MainActivity.class);

/** as in source code  - new intent constructor */
public Intent(Context packageContext, Class<?> cls) {
    mComponent = new ComponentName(packageContext, cls);
}

如果你想检查你是否有与之前尝试使用相同的未决意图:

 Intent.filterEquals(oherIntent);

要取消闹钟,您有两个选项使用标志使用相同的警报意图

PendingIntent.FLAG_CANCEL_CURRENT

&安培;我建议将未决意图作为最终意图 - 例如:

 /**
 * create pending intent
 */
final PendingIntent pIntent(Intent alarmIntent) {
    // Create a PendingIntent to be triggered when the alarm goes off
    return PendingIntent.getBroadcast(getApplicationContext(), AlarmReceiver.REQUEST_CODE,
            alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
}


 /**
 * cancel alarm
 */
public void cancelAlarm(Intent alarmIntent, Context context) {
    try {

        AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        /** use flag cancel here */
        PendingIntent pIntent = PendingIntent.getService(context, AlarmReceiver.REQUEST_CODE, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT);
        /** cancel alarm */
        alarm.cancel(pIntent);

    } catch (Exception e) {
        // handle exception here 
    }
}

为什么要使待定意图最终?

因为要取消闹钟你需要:

  • 使用相同的ID和适当的意图FLAG创建待处理的意图。

    (以获取对当前未决意图的引用)

PendingIntent.getBroadcast(context, REQUEST_CODE, intent, 
                       PendingIntent.FLAG_UPDATE_CURRENT);
  • 取消该待决意图。
PendingIntent.cancel();
  • 使用闹钟管理器取消闹钟。
AlarmManager.cancel(PendingIntent);

PendingIntent 本身只是对系统维护的令牌的引用,该令牌描述了用于检索它的原始数据。这意味着,即使其拥有的应用程序的进程被终止,PendingIntent本身也将保持可用于已经给出它的其他进程。如果创建应用程序稍后重新检索相同类型的PendingIntent(相同的操作,相同的Intent操作,数据,类别和组件以及相同的标志),它将接收表示同一令牌的PendingIntent,如果它仍然有效,并且可以因此,请调用 cancel()将其删除。

答案 1 :(得分:-1)

如果您正在使用活动,请使用

PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(),
                            12345, intent,0);