如何取消Android中的持续警报

时间:2014-08-05 10:41:07

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

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

取消可能由其他任何应用程序设置的警报的方法是什么?

我所拥有的是,当警报触发时,Android Notification Center上会发布通知。

我从android文档中读到我需要PendingIntent取消触发的警报。但是在这种情况下如何获得PendingIntent?

我注意到我可以从警报通知获取contentIntent,发布到Android通知中心。我试图取消PendingIntent的警报,但没有成功。

任何获得PendingIntent触发警报的方法?或/和取消闹钟?

1 个答案:

答案 0 :(得分:1)

这个技巧有点旧,但它节省了许多开发人员。

假设在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独特,这是最重要的。

因此我们必须在SharedPreference中保存PendingIntent id以在取消时进行确认。

现在Context使用了AlarmManager

在同一个Activity(ActivityOne)中,我们必须创建一个包含原始Context的全局Context。像:

//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);