Notification详解

    xiaoxiao2026-03-12  15

    摘抄的博客:

    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/

    转载请注明原文地址: https://ju.6miu.com/read-1307869.html
    最新回复(0)