Android之Notification使用

引:作为对Notification学习的一个总结.涉及到RemoteView的使用.

Notification使用

Notification的使用牵涉到三个关键类:Notification,Notification.Builder,NotificationManager

Notification - Notification类标识一个Notification.其中包括Icon,标题,内容,时间戳,LED闪烁形式,震动形式,提示声音等等.

Notification.Builder - Notification类构造器.在HONEYCOMB(API level 11)新增加的工具类.在HONEYCOMB之前的版本,Notification很多属性都是通过Flag设置.很繁琐而且使用起来很别扭.Notification.Builder内部也是通过Notification类实现.但是提供了很多setXXX方法设置Flag.使用起来更容易.

NotificationManager - Notification管理类,负责对notification管理.通过notify函数显示、更新notification.

package com.example.dsliang.notificationdemo;import android.app.Activity;import android.app.Notification;import android.app.NotificationManager;import android.content.Context;import android.graphics.BitmapFactory;import android.os.Bundle;import android.view.View;import android.widget.Button;public class MainActivity extends Activity {    Button btnShow;    NotificationManager notificationManager;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);        btnShow = (Button) findViewById(R.id.btnShow);        btnShow.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Notification notification;                Notification.Builder builder;                //Api大于等于HONEYCOMB,使用Notification.Builder创建notification                builder = new Notification.Builder(MainActivity.this);                builder.setTicker("滚动提示"); //N滚动提示                builder.setContentTitle("应该是标题"); //标题                builder.setContentText("这个是内容"); //内容                builder.setSmallIcon(android.R.drawable.sym_action_chat); //Icon 如果不设置Icon,Notification不会跳出来                builder.setAutoCancel(false); //点击以后是否自动清除,true-点击后自动清除,false-点击以后不会自动清除                builder.setContentInfo("右侧提示");                //铃声,震动,提示灯默认设置.                // DEFAULT_ALL会忽略已经设置的震动,声音,提示等设置                //除此还有三个参数 DEFAULT_SOUND - 默认声音, DEFAULT_VIBRATE - 默认震动, DEFAULT_LIGHTS - 默认提示灯                builder.setDefaults(Notification.DEFAULT_ALL);                //但设置了LargeIcon,小图标依然会在状态栏中显示.当时下拉状态的时候大图会显示在左边,小图片给显示在右下角                builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), android.R.drawable.sym_action_call));                //在右边显示一个数量,等价于setContentInfo函数.如果有设置setContentInfo函数,那么本函数会给覆盖//                builder.setNumber(12);                //是否常驻状态栏                //builder.setOngoing(true);                //setOnlyAlertOnce 是否提示一次.true - 如果Notification已经存在状态栏即使在调用notify函数也不会更新.                builder.setOnlyAlertOnce(true);                //滚动条                //setProgress (int max, int progress, boolean indeterminate)                //indeterminate true - 不确定的,不会显示进度,false - 根据max和progress情况显示进度条                builder.setProgress(100, 50, false);                //显示一个计数器                builder.setUsesChronometer(true);                //点击事件                // PendingIntent ClickPending = PendingIntent.getActivity(MainActivity.this, 0, new Intent().setClass(MainActivity.this, NotificationActivity.class), 0);                //builder.setContentIntent(ClickPending);                //清除事件                //PendingIntent DelPending = PendingIntent.getActivity(MainActivity.this, 0, new Intent().setClass(MainActivity.this, NotificationActivity.class), 0);                //builder.setDeleteIntent(DelPending);                notification = builder.build();                notificationManager.notify(1, notification);            }        });    }}

随便展示几张截图:

Android Notification使用_第1张图片

代码中对一些常用的函数附上注释.其中要注意的地方
1.builder.setSmallIcon(android.R.drawable.sym_action_chat)如果不设置Icon那么Notification不会显示出来.文档中也写得很清楚.

2.builder.setContentInfo(“右侧提示”)和builder.setNumber(12)作用是一样,setContentInfo函数会覆盖setNumber函数.其实一个是显示字符串一个是显示数字.setContentInfo函数完全可以实现setNumber函数的功能.

3.notificationManager.notify(“notify”, 1, notification)和notificationManager.notify(1, notification)的区别.notification是已(tag,id)键值对表示一个notification.notificationManager.notify(“notify”, 1, notification)和notificationManager.notify(1, notification)即使是同一个notification但是还是因为(tag,id)当中tag一个为null一个为”notify”,字符串.这个时候系统会显示两个一样的notification.

总结:创建notification类,包含两类函数.第一类属于对界面的调整,例如setProgress,setSmallIcon ,setContentText等.还有一类属于对notification表现形态(震动,意图,常驻等)的调整,例如setLights,setOnlyAlertOnce等.在实战实用中对第二种调整是更有意义!因为第一种只是对notification系统平台提供的RemoteView进行调整.在项目当中更多我们会自定义RemoteView.

Notification部分源码片段分析

什么是RemoteView?
在第一次使用Notification的时候我就已经好奇.为啥Notification不会设计成和普通View一样的使用方式?理由很简单!状态栏不是单单由你的应用程序管理.状态栏是由Android系统管理的.你需要显示Notification就必须和系统打交道.必须通过Notification服务才能显示你的Notification.所以设计成用一个Notification实例代表一个Notification,然后通过notificationManager.notify函数提交给Notification服务.
Notification服务是什么?是一个独立的线程!
又扯出一个问题.跨线程显示View.该怎么显示?不是在本应用程序显示View.这里就要借用RemoteView.
RemoteView理解成对一个View的封装,然后把RemoteView提交给其他线程.其他线程接收到RemoteView并且解析里面View的信息把它显示出来.

在使用系统自带的Notification系统会创建一个默认的RemoteView!

Android Notification使用_第2张图片

Android Notification使用_第3张图片

系统默认使用R.layout.notification_template_material_base生产一个RemoteView.

notification提供setContent(RemoteViews views)函数给我们设置我们自定义的RemoteView.自定义RemoteView就是这样简单了!

Notification总结

Notification总结:其实系统提供的Notification View功能是很强大的!图片,文字,计数器,进度条,按钮一些很常用的控件都提供了.对于Notification没有特殊要求的程序一般都能满足.当然需要个性化就自定义RemoteView.Notification的学习更重要在于了解Notification行为的设置.事实上Notification完全就是一个进程之间的通信.我们的App和Notification管理的通信.一个作为客户端一个作为服务端.通过Notification类传递相应的数据.

参考

1:Notification - http://www.android-doc.com/reference/android/app/Notification.html

2:NotificationManager - http://www.android-doc.com/reference/android/app/NotificationManager.html

3:Notification.Builder - http://www.android-doc.com/reference/android/app/Notification.Builder.html#setProgress(int, int, boolean)

4:RemoteViews - http://www.android-doc.com/reference/android/widget/RemoteViews.html

更多相关文章

  1. Android系统体系结构概要
  2. Android调用系统发送短信界面
  3. Android JNI char* 和jstring类型相互转换函数。
  4. android判断当前系统用的是什么语言
  5. Android8.1 系统修改默认的wifi直连名字
  6. 判断当前网络是否可用和调用系统设置wifi界面
  7. Android SearchView介绍及搜索提示实现

随机推荐

  1. Android之view重绘
  2. Android(安卓)application context/activ
  3. Android(安卓)application context/activ
  4. Android(安卓)java.io.FileNotFoundExcep
  5. 谈谈你对Android(安卓)NDK的理解
  6. 第六章 Android(安卓)绘图机制与屏幕适配
  7. 安卓开发学习之012 TextView高级应用
  8. android studio gradle自动签名构建实现
  9. android UI进阶之弹窗的使用(2)--实现通讯
  10. android & Linux uevent机制