通知栏服务
获取通知栏服务:
NotificationManager nm = (NotificationManager)mContext.getSystemService(Context.NOTIFICATION_SERVICE);
通知栏监听:
继承NotificationListenerService,实现onNotificationPosted(StatusBarNotification sbn)收到通知时回调,onNotificationRemoved(StatusBarNotification sbn)移除通知时回调
PendingIntent相关:
public static PendingIntent getActivity(Context context, int requestCode,
Intent intent, int flags)
public static PendingIntent getBroadcast(Context context, int requestCode
Intent intent, int flags)
public static PendingIntent getService(Context context, int requestCode,
Intent intent, int flags)
Flag:
FLAG_CANCEL_CURRENT:如果要创建的PendingIntent
已经存在了,那么在创建新的PendingIntent之前,
原先已经存在的PendingIntent中的intent将不能使用
FLAG_NO_CREATE:如果要创建的PendingIntent尚未存在
,则不创建新的PendingIntent,直接返回null
FLAG_ONE_SHOT:相同的PendingIntent只能使用一次
,且遇到相同的PendingIntent时不会去更新PendingIntent中
封装的Intent的extra部分的内容
FLAG_UPDATE_CURRENT:如果要创建的PendingIntent已经存在了
,那么在保留原先PendingIntent的同时,将原PendingIntent封装的Intent中
的extra部分替换为现在新创建PendingIntent的intent中extra的内容
PendingIntent判断是否相等
PendingIntent重写了equals方法,判定两个PendingIntent是否相同的依据是它封装的Intent是否“相同”和requestCode是否一致。注意,“相同”上打了引号,这是因为在比较PendingIntent中封装的intent时是否相同时,使用的是Intent的filterEquals方法,该方法认为只要两个intent具有相同的action、data、categories、components、type和flags(这个flags是intent的flags)就认为它们两个是“相同”的,filterEquals是不会比较两个intent的extra部分和内存地址的。另外需要注意的是,Intent并没有重写equals方法,所以如果使用Intent的equals方法比较两个intent对象的话,比较的是两个对象的内存地址。看有如下代码示例:
int requestCode = 1;
Intent intentA = new Intent( );
intentA.putExtra("name","AAA");
Intent intentB = new Intent( );
intentB.putExtra("name","BBB");
PendingIntent p1 = PendingIntent.getActivity(context, requestCode, intentA, 0);
PendingIntent p2 = PendingIntent.getActivity(context, requestCode, intentB, 0);
Log.d("TAG","两个intent是否相等(equals)"+intentA.equals(intentB));//false
Log.d("TAG","两个intent是否相等(filterEquals)"+intentA.filterEquals(intentB));//true
Log.d("TAG","两个PendingIntent是否相等"+p1.equals(p2));//true