android - 如何在 Android 中取消正在进行的闹钟

标签 android android-notifications android-pendingintent android-alarms

我正在制作一个应用程序,我想在几秒钟后取消警报(不是我的应用程序设置的)。

取消其他应用程序可能设置的闹钟的方法是什么?

我所拥有的是,当警报触发时,通知会发布在 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/

相关文章:

java - Android WebView 不可滚动

Android:当用户单击此链接时,我如何共享链接并打开 Activity

android - 在 android 通知中创建一个 map Activity

java - 设置待处理 Intent 的方式和内容

Android:使用 Context.startService 与 PendingIntent.getService 启动服务

java - 创建不同的 PendingIntent 对象 - 请求代码与不同的 Intent

android - 向上滚动时,折叠工具栏中的 SearchView 被隐藏

java - 在 Android 布局中挖洞

特定日期的 Android 通知

android - 如何获得 X 按钮以停止 Android P 上的媒体样式通知?