Notifycation的组成元素
对于一个通知来说,主要包含下面六个部分。其中只有1、3、5三项是必须设置的,其余几项可选。不同ROM以及不同版本默认实现不同。
对上图中六个部分相应的设置函数如下
1.内容标题 setContentTitle() 2.大图标 setLargeIcon() 3.内容 setContentText() 4.内容附加信息 setNumber (int number) 5.小图标 setSmallIcon() 6.时间 setWhen/setShowWhen();
创建一个Notifycation的步骤
1>实例化一个Notification.Builder对象
2>调用builder的相关方法对notification进行上面提到的各种设置
3>调用builder.build()方法此方法返回一个notification对象。
4>实例化一个NotificationManager对象。
5>调用NotificationManager的notify方法。
实例如下:
//实例化一个Notification.Builder对象 Notification.Builder builder = new Builder(this); //调用builder的相关方法对notification进行上面提到的各种设置 builder.setSmallIcon(R.drawable.ic_launcher); builder.setContentTitle("您有新的消息"); builder.setContentText("这是您的消息内容"); builder.setTicker("提示");//在通知栏顶部的提示 //builder.setDefaults(Notification.DEFAULT_SOUND);//设置提示声音 //builder.setDefaults(Notification.DEFAULT_LIGHTS);//设置指示灯 //builder.setDefaults(Notification.DEFAULT_VIBRATE);//设置震动 builder.setDefaults(Notification.DEFAULT_ALL);// 上面所有 builder.setAutoCancel(true); //用户点击以后,通知消失 //builder.setOngoing(true); //设置是否常驻通知栏 //指示灯和震动需要添加权限 //<uses-permission android:name="android.permission.FLASHLIGHT" /> //<uses-permission android:name="android.permission.VIBRATE" /> /* 设置点击通知启动一个Activity * 使用PendingIntent 延迟的Intent,没有构造函数,只能通过 * PendingIntent.getActivity 获取其实例 */ builder.setContentIntent(PendingIntent.getActivity(this, 0, intent,0)); //调用builder.build()方法此方法返回一个notification对象。 Notification notify = builder.build(); //实例化一个NotificationManager对象 NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); //调用manager的notify方法 //id 标识通知,如果发送通知id相同,则更新通知,不同则显示多条通知,调用manager.cancel(id);取消通知 manager.notify(id, Notification)
自定义Notifycation的布局
要想自定义Notifycation的布局,我们需要使用android.widget.RemoteViews对象,然后通过setContent()方法即可将视图设置给Notifycation。如果我们想刷新一个已经发出的Notifycation,那么我们需要在调用NotificationManager的notify方法的时候传入相同的id即可。
//实例化一个RemoteViews //packageName:对应资源文件包名 getPackageName() 获取当前程序的包 //layoutId:资源文件id RemoteViews views = new RemoteViews(String packageName, int layoutId); //可以调用其的setXXX方法设置布局里面的东西,比如 views.setTextViewText (int viewId, CharSequence text) //设置RemoteViews到Notifycation,可以通过Notifycation实例设置,也可以通过Builder设置 Notifycation.setContext(RemoteViews) Notifycation.Builder.setContext(RemoteViews)
支持的View类型
- FrameLayout、LinearLayout、RelativeLayout、GridLayout、AnalogClock、Button、Chronometer、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView、AdapterViewFlipper、ViewStub。
- 只支持上述的View,不支持它们的子类和其他类型的View,所以无法在RemoteViews中自定义View,如果使用了不支持的布局那么会不显示
Notifycation的其他常用方法
- builder.setVibrate(long[]) 设置震动
- setPriority() 设置优先级
优先级 | 用户 | 值 |
MAX | 重要而紧急的通知,通知用户这个事件是时间上紧迫的或者需要立即处理的。 | Notification.PRIORITY_MAX |
HIGH | 高优先级用于重要的通信内容,例如短消息或者聊天,这些都是对用户来说比较有兴趣的。 | Notification.PRIORITY_HIGH |
DEFAULT | 默认优先级用于没有特殊优先级分类的通知。 | Notification.PRIORITY_DEFAULT |
LOW | 低优先级可以通知用户但又不是很紧急的事件。 | Notification.PRIORITY_LOW |
MIN | 用于后台消息 (例如天气或者位置信息)。最低优先级通知将只在状态栏显示图标,只有用户下拉通知抽屉才能看到内容。 | Notification.PRIORITY_MIN |
- setOngoing(true/false)
功能:设置为ture,表示它为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接),常驻通知栏,只能通过NotifycationManager .cancel(id) 取消
- setProgress(int max, int progress,boolean indeterminate)
max:进度条最大数值 、progress:当前进度、indeterminate:表示进度是否不确定,true为不确定,设置带进度条的通知,可以在下载中使用
Notifycation 8.0的更改
关于在高版本上面的Notifycation的改变,可以查看http://27house.cn/archives/1410