我正在制作一个应用程序,我想在几秒钟后取消警报(不是我的应用程序设置的)。
取消其他应用程序可能设置的闹钟的方法是什么?
我所拥有的是,当警报触发时,通知会发布在 Android 通知中心。
我从 android 文档中读到我需要 PendingIntent 来取消触发的警报。但是在这种情况下我怎样才能获得 PendingIntent?
我注意到我可以从发布到 Android 通知中心的警报通知中获取 contentIntent。我试图从这个 PendingIntent 中取消警报,但没有成功。
有什么方法可以获取触发警报的 PendingIntent?或者/以及取消闹钟?
最佳答案
这个技巧有点老了,但是却拯救了很多开发者。
假设在 ActivityOne 中我们启动了一个 AlarmManager,如下所示:
AlarmManager mgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, OnServiceReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 5290, i, 0);
mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + 60000, LOCAL_SERVICE_PERIOD, pi);
要在任何其他 Activity/Broadcastreceiver/Service 中取消此 AlarmManager,我们必须记住它的一些信息。
1:上下文:AlarmManager 使用的上下文,后跟其 PendingIntent。
2: PendingIntent ID: getBroadcast(context, 5290, i, 0); .它使 Pi 独一无二,这最重要。
因此我们必须将 PendingIntent id 保存在 SharedPreference 中,以便在取消时进行确认。
现在 AlarmManager
使用的 Context
。
在同一个 Activity(ActivityOne) 中,我们必须创建一个全局上下文来保存原始上下文。喜欢:
//Define it globaly in ActivityOne
private static Context mContext;
//create a public static method which holds the current context and share
public static Context getActivityOneContext() {
return ActivityOne.mContext;
}
//initialize it by assigning application context in onCreate() method
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.xxx);
mContext = getApplicationContext();
//Or if this is a BroadCastReceiver ..use the current context and do same in onReceive()
//OnBootReceiver.mContext = context.getApplicationContext();
现在您可以在应用程序的任何位置取消 AlarmManager..
AlarmManager mgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent stopIntent = new Intent(ActivityOne.getActivityOneContext, OnServiceReceiver.class);
PendingIntent stopPI = PendingIntent.getBroadcast(ActivityOne.getActivityOneContext, 5290, stopIntent, 0);
mgr.cancel(stopPI);
关于android - 如何在 Android 中取消正在进行的闹钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25136821/