Notification详解

摘抄的博客:

http://blog.csdn.net/xy_nyle/article/details/19853591

http://blog.csdn.net/vipzjyno1/article/details/25248021

一、Notification的简单使用

作用:显示在通知栏中的通知列表中的控件

首先看一下Notification的完整显示:

Notification详解_第1张图片

使用原理:

通过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详解_第2张图片

八、其他配置

    之后还有声音、闪光灯提示的配置(暂时就先不讲了)

③、设置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调用

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的方法

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详解_第3张图片
目的:notification点击到ThirdActivity,一次回退回去。
首先:要在AndroidManfest.xml中声明ThirdActivity的上一个Activity是SecondActivity。以此类推,SecondActivity的上一个是FristActivity...。
怎么声明呢:
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这个类:就是一个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/










你可能感兴趣的:(Android)