转载请标明出处:
http://blog.csdn.net/zq2114522/article/details/50453244;
本文出自:【梁大盛的博客】
引:作为对Notification学习的一个总结.涉及到RemoteView的使用.
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);
}
});
}
}
代码中对一些常用的函数附上注释.其中要注意的地方
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.
什么是RemoteView?
在第一次使用Notification的时候我就已经好奇.为啥Notification不会设计成和普通View一样的使用方式?理由很简单!状态栏不是单单由你的应用程序管理.状态栏是由Android系统管理的.你需要显示Notification就必须和系统打交道.必须通过Notification服务才能显示你的Notification.所以设计成用一个Notification实例代表一个Notification,然后通过notificationManager.notify函数提交给Notification服务.
Notification服务是什么?是一个独立的线程!
又扯出一个问题.跨线程显示View.该怎么显示?不是在本应用程序显示View.这里就要借用RemoteView.
RemoteView理解成对一个View的封装,然后把RemoteView提交给其他线程.其他线程接收到RemoteView并且解析里面View的信息把它显示出来.
在使用系统自带的Notification系统会创建一个默认的RemoteView!
系统默认使用R.layout.notification_template_material_base生产一个RemoteView.
notification提供setContent(RemoteViews views)函数给我们设置我们自定义的RemoteView.自定义RemoteView就是这样简单了!
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