gpt4 book ai didi

android - 从其他 Activity 中停止 alarmManager

转载 作者:行者123 更新时间:2023-11-30 01:59:02 24 4
gpt4 key购买 nike

我试图通过 Map Activity 中的 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);

map Activity 中的代码:

@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);
}

最佳答案

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

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 ,你可以尝试使用:

 Intent.filterEquals(oherIntent);

要取消警报,您有两种选择使用标志对警报使用相同的 Intent :

PendingIntent.FLAG_CANCEL_CURRENT

& i 建议将未决意向作为最终意向 - 示例:

 /**
* 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 和适当的 intent FLAG 创建待处理的 intent。

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

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

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

关于android - 从其他 Activity 中停止 alarmManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31766010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com