Notification详解
2016-08-16 10:43
232 查看
摘抄的博客:
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交给系统。
创建方法:
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调用
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的方法
notificationBuilder.setAutoCancel(true);
2、设置无法被删除的Notification(类似墨迹天气一样,全部删除都删不掉的notification)
notificationBuilder.setOngoing(true); //只能通过代码cancel()才能消失。
3、当Notification被删除时候,我们如何监听。
//创建pendingIntent
Intent deleteIntent = new Intent(this, DeleteService.class);
int deleteCode = (int) SystemClock.uptimeMillis();
PendingIntent deletePendingIntent = PendingIntent.getService(this,
deleteCode, deleteIntent, PendingIntent.FLAG_UPDATE_CURRENT);
//当notification被删除的时候,会触发指定的pendingIntent
notifyBuilder.setDeleteIntent(deletePendingIntent);
4、①、比如说今日头条,推送一条新闻到通知栏上,点击notification之后,会显示到新闻界面,然后再点击退出,返回的是今日头条的首页。②、还有另一种是,点击进去之后,再back就直接退出,返回到原先的界面。
第二种:就是我们默认的方式。
那么我们如何制作第一种方式呢。
我有一个App,Activity的顺序是这样的
目的:notification点击到ThirdActivity,一次回退回去。
首先:要在AndroidManfest.xml中声明ThirdActivity的上一个Activity是SecondActivity。以此类推,SecondActivity的上一个是FristActivity...。
怎么声明呢:
调用android:parentActivityName=""属性就可以了。
为了保证向下兼容,所以还要加上
合起来就是:
以此类推的声明,直到MainActivity,这样就形成了回退栈。
完成了创建回退栈之后,我们怎么使用回退栈呢
我们就需要用到TaskStackBuilder这个类:就是一个Stack
创建TaskStackBuilder:
接收Context
将ThirdActivity的回退栈放到taskBuilder中:
taskBuilder.addParentStack(ThirdActivity.class);//这个回退栈就是我们之前在AndroidManifest.xml中配置的。
创建启动的Intent,并将本身放到栈中:
taskBuilder.addNextIntent(new Intent(MainActivity.this,ThirdActivity.class));
所以说:如果顺序弄反了的话。
就是先调用addNextIntent()后调用addParentStack()就会造成,nextIntent()的Activity先进入栈中,parentStack()后进入栈中。所以最先显示的是SecondActivity,最后显示ThirdActivity。
栈:→
ThirdActivity →MainActivity→FirstActivity→SecondActivity 。所以SecondActivity最先显示。
返回一个PendingIntent:
第一参数表示:requestCode
第二参数表示:flag标识符
完整代码:
未完成的①、自定义Notification与RemoteView解析 ②、各种各样的Notification :地址http://glgjing.github.io/blog/2015/11/18/android-kai-fa-zhi-notification-xiang-jie/
http://blog.csdn.net/xy_nyle/article/details/19853591
http://blog.csdn.net/vipzjyno1/article/details/25248021
一、Notification的简单使用
作用:显示在通知栏中的通知列表中的控件首先看一下Notification的完整显示:
使用原理:
通过Nofitication的配置类NotificationCompat.Builder配置Notification的View,配置完成后通过PendingIntent设置点击事件,最后通过NotificationService交给系统。
①、创建NotificationCompat
注意:使用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("测试");
八、其他配置
之后还有声音、闪光灯提示的配置(暂时就先不讲了)
③、设置notification的点击事件
示例: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调用
<span style="font-size:18px;">Notication notify = notification.build();//配置类,生成Notification实例 notify.flag = Notification.FLAG_AUTO_CANCEL;</span>
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的方法
notificationBuilder.setAutoCancel(true);
2、设置无法被删除的Notification(类似墨迹天气一样,全部删除都删不掉的notification)notificationBuilder.setOngoing(true); //只能通过代码cancel()才能消失。
3、当Notification被删除时候,我们如何监听。
//创建pendingIntent
Intent deleteIntent = new Intent(this, DeleteService.class);
int deleteCode = (int) SystemClock.uptimeMillis();
PendingIntent deletePendingIntent = PendingIntent.getService(this,
deleteCode, deleteIntent, PendingIntent.FLAG_UPDATE_CURRENT);
//当notification被删除的时候,会触发指定的pendingIntent
notifyBuilder.setDeleteIntent(deletePendingIntent);
4、①、比如说今日头条,推送一条新闻到通知栏上,点击notification之后,会显示到新闻界面,然后再点击退出,返回的是今日头条的首页。②、还有另一种是,点击进去之后,再back就直接退出,返回到原先的界面。
第二种:就是我们默认的方式。
那么我们如何制作第一种方式呢。
我有一个App,Activity的顺序是这样的
目的:notification点击到ThirdActivity,一次回退回去。
首先:要在AndroidManfest.xml中声明ThirdActivity的上一个Activity是SecondActivity。以此类推,SecondActivity的上一个是FristActivity...。
怎么声明呢:
<activity android:name=".ThirdActivity" android:parentActivityName=".SecondActivity">
调用android:parentActivityName=""属性就可以了。
为了保证向下兼容,所以还要加上
<meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".SecondActivity"/>
合起来就是:
<activity android:name=".ThirdActivity" android:parentActivityName=".SecondActivity">
<!--为了向下兼容-->
<meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".SecondActivity"/>
</activity>
以此类推的声明,直到MainActivity,这样就形成了回退栈。
完成了创建回退栈之后,我们怎么使用回退栈呢
我们就需要用到TaskStackBuilder这个类:就是一个Stack
创建TaskStackBuilder:
TaskStackBuilder taskBuilder = TaskStackBuilder.create(MainActivity.this);
接收Context
将ThirdActivity的回退栈放到taskBuilder中:
taskBuilder.addParentStack(ThirdActivity.class);//这个回退栈就是我们之前在AndroidManifest.xml中配置的。
创建启动的Intent,并将本身放到栈中:
taskBuilder.addNextIntent(new Intent(MainActivity.this,ThirdActivity.class));
所以说:如果顺序弄反了的话。
就是先调用addNextIntent()后调用addParentStack()就会造成,nextIntent()的Activity先进入栈中,parentStack()后进入栈中。所以最先显示的是SecondActivity,最后显示ThirdActivity。
栈:→
ThirdActivity →MainActivity→FirstActivity→SecondActivity 。所以SecondActivity最先显示。
返回一个PendingIntent:
PendingIntent pendingIntent = taskBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
第一参数表示:requestCode
第二参数表示:flag标识符
完整代码:
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);
未完成的①、自定义Notification与RemoteView解析 ②、各种各样的Notification :地址http://glgjing.github.io/blog/2015/11/18/android-kai-fa-zhi-notification-xiang-jie/
相关文章推荐
- 中值滤波
- iOS开发之APP进入后台禁止自动截图
- iOS开发之Objective-c的AES加密和解密算法的实现
- Random随机生成几位数字和UUID随机生成几位字母加数字组合
- iOS开发之Objective-c的SHA224/SHA256/SHA384/SHA512加密算法的实现
- [Android]使用android-junit-report.jar导出单元测试报告
- [Android]升级SDK tools后ant自动编译脚本错误
- [iOS]使用Dropbox的https外链OTA部署APP
- [iOS]UIWebView禁止前进和后退
- [iOS]7.1使用OTA部署APP出现Cannot install applications错误
- [iOS]UILabel取消自动Trim空格和换行等空白字符
- [Android]使用Emma进行单体测试代码覆盖率分析
- Android控件RecyclerView和ListView的异同
- spring 扫描包 不起作用
- [iOS]CoreGraph在64位模式下与NSString drawInRect冲突
- [iOS]使用UIActivityViewController实现AirDrop功能
- [iOS]iPad和iPhone版本xib文件相互转换
- HDU 3518 Boring counting
- spring优化使用
- Intellij IDEA 创建控制台项目,断点调试快捷方式