摘抄的博客:
http://blog.csdn.net/xy_nyle/article/details/19853591
http://blog.csdn.net/vipzjyno1/article/details/25248021
作用:显示在通知栏中的通知列表中的控件
首先看一下Notification的完整显示:
使用原理:
通过Nofitication的配置类NotificationCompat.Builder配置Notification的View,配置完成后通过PendingIntent设置点击事件,最后通过NotificationService交给系统。
注意:使用v4的包,达到向下兼容目的
创建方法:
NotificationCompat.Builder notification = new NotificationCompat.Builder(Context context);
一 标题:
notification.setContentTitle("标题");
二 左边的图片:
notification.setSmallIcon(R.mipmap.ic_launcher);
三 内容简介:
notification.setContentText("内容简介");
这三个是最主要,其他都是可选项,可配置可不配置
四、右下角的数字
notification.setNumber(10);
五:右下角的图片
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
notification.setLargeIcon(bitmap);
当我们设置大图的时候,大图变成左边的图,setSmallIcon()自动变成右下角的图。
六、时间
notification.setWhen(System.currentTimeMillis());//内部属性为long,设置当前时间为time
七、特殊的提示栏(显示在状态栏上)
notification.setTicker("测试");
八、其他配置
之后还有声音、闪光灯提示的配置(暂时就先不讲了)
示例:
Intent intent = new Intent(this,SecondActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this
,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
notification.setContentIntent(pendingIntent);
PendingIntent
作用:表示不确定时候发动的Intent。Intent表示立即发动的Intent。
使用场景:主要用于远程服务通信、闹铃、通知、启动器、短信中
主要方法:
static PendingIntent getActivity(Context context,int requstCode,Intent intent,int flag);
static PendingIntent getService(Context context,int requstCode,Intent intent,int flag);
static PendingIntent getBroadcast(Context context,int requstCode,Intent intent,int flag)
这三个方法相当于Activity的startActivity(),startService()方法
int requstCode:唯一标记值,让接受Intent知道是哪个放的。跟StartActivity()一样
int flag:是PendingIntent的位表示符。主要属性表
FLAG_ONE_SHOT 表示返回的PendingIntent仅能执行一次,执行完后自动取消
FLAG_NO_CREATE 表示如果描述的PendingIntent不存在,并不创建相应的PendingIntent,而是返回NULL
FLAG_CANCEL_CURRENT 表示相应的PendingIntent已经存在,则取消前者,然后创建新的PendingIntent,这个有利于数据保持为最新的,可以用于即时通信的通信场景
FLAG_UPDATE_CURRENT 表示更新的PendingIntent
这么描述肯定无法知晓作用。稍后举例,我们先看如何将Notification在通知栏中显示
④、显示Notificaiotn
使用:
//获取系统关于Notification的服务
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//将notification利用服务交给系统
manager.notify(1,notification.build());
方法:
NotificationManager.notify(int id,Notification notifiy);
id:该notification的唯一命名。 将来的更新和删除都是通过该方法
notifiy:故名思意。 该例子中,是通过配置类NotificationCompat.build()生成的。
二、Notifaction进阶:
①、创建
1、设置提醒标志符Flags
作用:①、当通知栏接收到Notification时候的铃声或者呼吸灯的提示类型。(只响铃、还是只响呼吸灯,或者震动等)
②、当使用notification的使用,设定类型(是否点击后通知栏消失、还是只有全部清除的时候才能清除、默认是不设置的话,点击之后通知栏不消失。)
提醒标志符类型:
Notification.FLAG_SHOW_LIGHTS //三色灯提醒,在使用三色灯提醒时候必须加该标志符
Notification.FLAG_ONGOING_EVENT //发起正在运行事件(活动中)
Notification.FLAG_INSISTENT //让声音、振动无限循环,直到用户响应 (取消或者打开)
Notification.FLAG_ONLY_ALERT_ONCE //发起Notification后,铃声和震动均只执行一次
Notification.FLAG_AUTO_CANCEL //用户单击通知后自动消失
Notification.FLAG_NO_CLEAR //只有全部清除时,Notification才会清除 ,不清楚该通知(QQ的通知无法清除,就是用的这个)
Notification.FLAG_FOREGROUND_SERVICE //表示正在运行的服务
使用:实例化成Notifaction调用
Notication notify = notification.build();//配置类,生成Notification实例
notify.flag = Notification.FLAG_AUTO_CANCEL;
2、设置铃声类型、震动时间、呼吸灯默认显示样式
方法:
Notification.setDefaults(int defaults);
作用:设置默认的提示,设置之后同方法一。
defaults属性:
DEFAULT_ALL 使用默认字段
DEFAULT_LIGHTS 默认闪光
DEFAULT_SOUND 默认声音(uri,指向路径)
DEFAULT_VIRATE 默认震动,后来得知需要添加震动权限VIBRATE: Android.permission.VIBRATE
3、自定义震动、铃声、呼吸灯(不提供如何使用了)
震动:setVibrate(long[] pattern)
灯光:setLights(intledARGB ,intledOnMS ,intledOffMS )
铃声:setSound(Uri sound)
4、设置优先级(优先级越高,摆放位置越向上)
方法:setPriority(int pri)
pri常量属性:
MAX 重要而紧急的通知,通知用户这个事件是时间上紧迫的或者需要立即处理的。
HIGH 高优先级用于重要的通信内容,例如短消息或者聊天,这些都是对用户来说比较有兴趣的。
DEFAULT 默认优先级用于没有特殊优先级分类的通知。
LOW 低优先级可以通知用户但又不是很紧急的事件。
MIN 用于后台消息 (例如天气或者位置信息)。最低优先级通知将只在状态栏显示图标,只有用户下拉通知抽屉才能看到内容。
②、PendingIntent与Notification之间的关系
1、Notification的更新和删除
NotificationManager的常用方法:
public void cancelAll() 移除所有通知 (只是针对当前Context下的Notification)
public void cancel(int id) 移除标记为id的通知 (只是针对当前Context下的所有Notification)
public void notify(String tag ,int id, Notification notification) 将通知加入状态栏, 标签为tag,标记为id
public void notify(int id, Notification notification) 将通知加入状态栏,,标记为id
创建与更新:
设定notification的id,如果id不存在,则在通知栏创建一个notification(创建)。如果id已经存在,则将当前配置覆盖在之前已存在id的notification上(更新)
删除:直接调用上面的cancel()
PendingIntent的FLAG的作用:
当notification表示更新的时候,是体现不出来的。(notify()时候上传的id相同)
只有当id不同的时候,表示创建不同的notification时候,且不同notification调用了相同的PendingIntent:
FLAG_ONE_SHOT:表示,当不同notification调用了相同的PendingIntent(就是我有两个notification,使用了同一个PendingIntent对象),只要一个notification被点击出发了pendingIntent,那么这个pendingIntent就被删除了。也就是说另一个notification的pendingIntent的值为null了,就触发不了pendingIntent了。
FLAG_NO_CREATE:这个标识符单独无法使用,很少碰到,不解释了。
FLAG_CANCEL_CURRENT:表示,删除相同的前一个pendingIntent。那么就是说第一个notification无法点击,只有最新的一个notification才能点击。
FLAG_UPDATE_CURRENT:表示,之前的pendingIntent都和最新的pendingIntent保持一致。
1、设置点击notification之后,关闭notification
因为默认配置,当notification被点击之后,notification并没有被删除。所以需要添加配置
方法①:刚才提到的添加Flag
Notifaction notifaction = notifactionBuilder.build();//通过配置类创建Notification
notification.flag = Notification.FLAG_AUTO_CANCEL;
方法②、调用notificationBuilder的方法
android:name=".ThirdActivity"
android:parentActivityName=".SecondActivity">
调用android:parentActivityName=""属性就可以了。
android:name="android.support.PARENT_ACTIVITY"
android:value=".SecondActivity"/>
合起来就是:
android:name=".ThirdActivity"
android:parentActivityName=".SecondActivity">
android:name="android.support.PARENT_ACTIVITY"
android:value=".SecondActivity"/>
以此类推的声明,直到MainActivity,
这样就形成了回退栈。
TaskStackBuilder taskBuilder = TaskStackBuilder.create(MainActivity.this);
PendingIntent pendingIntent = taskBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);第一参数表示:requestCode
TaskStackBuilder taskBuilder = TaskStackBuilder.create(MainActivity.this);
taskBuilder.addParentStack(ThirdActivity.class);taskBuilder.addNextIntent(new Intent(MainActivity.this,ThirdActivity.class)) ;PendingIntent pendingIntent = taskBuilder.getPendingIntent( 0 ,PendingIntent. FLAG_UPDATE_CURRENT) ;