前言
最近做一个dialog需要不点击确定过段时间还是会提示。就用到了PendingIntent和AlarmManager的组合来完成这项任务,中间遇到些问题。这里闲了下来,就看了下源码。但是忽然感觉源码不能回答我的问题,因为这里一个非常重要的参数(target)通过native来新构建的(ps这里貌似有adil,这一块不熟悉),调用的进程(AlarmManager、Notifiction)等目标进程不容易跟踪。但是通过读javadoc也了解了不少内容。就在这里写一篇短的博客当一个笔记。
PendingIntent的作用
基本功能很像intent。因为target本身一定包含一个intent,有机会再具体研究具体构成。这里主要说明下从javadoc得到的信息。具体作用是在当前context不存在时候,PendingIntent依然可以正常工作,这里非常适合定时工作,例如用在AlarmManager、Notifiction等中。
注意事项
- 作为构造参数的intent尽量使用详细的classname。这里推荐使用
java
intent.setclass(Context packageContext, Class<?> cls);
这里很多近似的代码。这里都是intent的内容。就不在这里详细研究了。 - 跨进程注意权限问题。
- 当有两个同样动作的intent的动作时候,应该让他们两个不一样,具体如何做我也不会(ps我是直接动用系统flag设置强制更新)。
- 有些方法没研究,
主要方法
这里主要是用来启动activity和service和发送广播。因此包含了三个主要方法getactivity()、getservice()、getBroadcast(),可以创建出一个用于启动activity、service、发送广播里的pengdingintent的实例。这里包含四个参数。第一个是context,也就是启动的context。第二个是requestcode。这里是用来返回值时使用的,具体如何使用没有测试(我都是默认填0,因为我不需要返回)。第三个参数是intent,也就是所要执行的动作(刚才提要尽量使用具体的classname)。第四个是个flag。标志着对于已经存在相同目的的PendingIntent是如何处理。这里简单介绍几个参数的意思,
1. FLAG_ONE_SHOT 当前PendingIntent仅仅能使用一次。使用过后立马回收
2.FLAG_NO_CREATE 、
*Flag indicating that if the described PendingIntent does not
* already exist, then simply return null instead of creating it.
这里貌似是说如果没有就返回空。不在创建。
3.FLAG_CANCEL_CURRENT要是当前存在就取消当前的。
4.FLAG_UPDATE_CURRENT更新当前的
代码讲解
获得service
Intent intent = new Intent(this,MyService.class);
PendingIntent pendingIntent = PendingIntent.getService(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
获取activity
Intent intent1 = new Intent();
intent1.setClassName(this.getPackageName(), Main2Activity.class.getName());
PendingIntent pendingIntent1 = PendingIntent.getActivity(this,0,intent1,PendingIntent.FLAG_UPDATE_CURRENT);
获取广播
Intent intent2 = new Intent("android.TEST.BRO");
PendingIntent pendingIntent2 = PendingIntent.getService(this,0,intent2,PendingIntent.FLAG_UPDATE_CURRENT);
具体使用这里写了两个例子供大家参考:
AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarmManager.set
(AlarmManager.RTC, Calendar.getInstance().getTimeInMillis() + 1000, pendingIntent);
Notification notify3 = new Notification.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setTicker("通过notifiction启动activity")
.setContentTitle("Notification Title")
.setContentText("This is the notification message")
.setContentIntent(pendingIntent1).setNumber(1).build();
notify3.flags |= Notification.FLAG_AUTO_CANCEL;
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(1,notify3);