我做了一个应用程序,我想在几秒钟后取消警报(不是由我的应用程序设置)。
取消可能由其他任何应用程序设置的警报的方法是什么?
我所拥有的是,当警报触发时,Android Notification Center上会发布通知。
我从android文档中读到我需要PendingIntent取消触发的警报。但是在这种情况下如何获得PendingIntent?
我注意到我可以从警报通知获取contentIntent,发布到Android通知中心。我试图取消PendingIntent的警报,但没有成功。
任何获得PendingIntent触发警报的方法?或/和取消闹钟?
答案 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);