参考
http://www.cnblogs.com/plokmju/p/android_Notification.html
http://www.2cto.com/kf/201401/274525.html
各属性对应的位置
其中左边大图为largeIcon,其右下角的灰块中显示的是smallIcon。
通过Builder创建:
与AlertDialog的创建一样,notification也可以通过内部类Builder来创建并设置其中的一些信息。但Notification必须通过系统服务NotificationManager来发送或者取消。如:
manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Button gv_list = (Button) findViewById(R.id.btn_notify);
gv_list.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Notification.Builder builder = new Notification.Builder(
MainActivity.this);
builder.setAutoCancel(true);
// 接收后在状态栏上显示的内部(不下拉时显示的内部),如果内部过长,会自动进行翻滚播放
builder.setTicker("你有一条未读通知");
builder.setContentTitle("contentTitle").setContentText("contentText");
builder.setSmallIcon(R.drawable.emoji_1f601);// 有两个用处:未下拉时显示的图标,下拉后显示的小图标
builder.setLargeIcon(BitmapFactory.decodeResource(
getResources(), R.drawable.ic_launcher));
builder.setContentInfo("contentInfo");
builder.setNumber(2);//设置该通知的个数。
builder.setWhen(System.currentTimeMillis()-1000*60*10);//设置通知的时间
//设置点击通知时要执行的Activity,此处是打开系统图库
Intent in = new Intent();
in.setAction(Intent.ACTION_PICK);
in.setType("image/*");
PendingIntent intent = PendingIntent.getActivity(
getApplicationContext(), 0, in,
PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(intent);
Notification build = builder.build();
manager.notify(0, build);//发送通知
}
注意:必须要调用的三个方法是:setSmallIcon(),setContentTitle()与setContentText()。
带进度条
只需要调用builder.setProgress()即可。如:
new Thread(new Runnable() {
@Override
public void run() {
int incr;
for (incr = 0; incr <= 100; incr += 5) {
builder.setProgress(100, incr, false);
manager.notify(0, builder.build());
try {
Thread.sleep(300);
} catch (InterruptedException e) {
}
}
builder.setContentText("完成")
.setProgress(0, 0, false);
manager.notify(0, builder.build());//把notification的id设置成一样的,这样就可以进行更新
}
}).start();
上面使用的是系统自带的带进度条的notification,也可以自定义一个,代码如下:
final RemoteViews views = new RemoteViews(getPackageName(), R.layout.second);
builder.setContent(views);//设置通知的显示view
new Thread(new Runnable() {
public void run() {
int incr;
for (incr = 0; incr <= 100; incr += 5) {
views.setProgressBar(R.id.progressbar, 100, incr, false);
manager.notify(0, builder.build());//一定要调用这个方法,不然不会出现进度条更新
try {
Thread.sleep(300);
} catch (InterruptedException e) {
}
}
views.setTextViewText(R.id.tv, "下载完成");
manager.notify(0, builder.build());
}
}).start();
直接通过notification设置
通过Builder设置的话,需要的版本比较高。如果要兼容低版本就需要通过Notification自身的一些属性进行设置。如:
Notification n = new Notification();
n.icon = R.drawable.ic_launcher;//状态栏上的图标
n.tickerText = "您有新的反馈信息";//状态栏上的提示文字
n.when = SystemClock.elapsedRealtime();//发送通知的时间
n.flags = Notification.FLAG_AUTO_CANCEL;
//下拉后显示的样子
RemoteViews view = new RemoteViews(getPackageName(),
R.layout.main);
view.setTextViewText(R.id.tv1, "这是test");//为布局中的textview设置文字
//为布局中的iamgeview设置图片
view.setImageViewResource(R.id.iv, R.drawable.ic_launcher);
n.contentView = view;
//点击通知时调用的intent
Intent intent = new Intent(MainActivity.this,
SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra("id", ++i);
//加上action是为了区别不能的intent,从而可以使不同的通知打开同一个界面
intent.setAction("action"+i);
PendingIntent pIntent = PendingIntent.getActivity(
MainActivity.this, 200, intent,
PendingIntent.FLAG_ONE_SHOT);
n.contentIntent = pIntent;
nm.notify(i, n);
上述是一些基本的设置,还可以设置声音、振动以及呼吸灯等。
声音
使用默认声音时只需要设置
n.defaults = Notification.DEFAULT_SOUND;
使用自定义声音:
n.sound = Uri.fromFile(tipFile);//使用项目中指定的声音
当然也可以使用系统本身就带有的:
n.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "1");
默认时,通知的声音播放一遍就结束。如果让声音循环播放,需要为flags参数加上FLAG_INSISTENT。这样声音会到用户响应才结束。
振动
默认的:
n.defaults = Notification.DEFAULT_VIBRATE;
自定义的:
long[] vibrate = {0,200,100,400};
n.vibrate = vibrate ;
呼吸灯
使用灯的时候,flags必须有Notification.FLAG_SHOW_LIGHTS.
默认的:
n.defaults = Notification.DEFAULT_LIGHTS;
自定义:
n.ledARGB = 0x0afaade9;
n.ledOffMS = 100;
n.ledOnMS = 100;
点击
处于状态栏中的notification是可以处理点击事件的。只要调用RemoteViews.setOnClickPendingIntent()即可。如:
Intent ci = new Intent(MainActivity.this, TestService.class);
PendingIntent cpi = PendingIntent.getService(MainActivity.this,
0, ci, PendingIntent.FLAG_UPDATE_CURRENT);
rv.setOnClickPendingIntent(R.id.mid_left, cpi);//第1个参数指的是点击的view的id,第二个参数指点击时的操作
由于点击时要指定一个PendingIntent,因为可以通过启动一个Service或者Activity来完成点击事件。常见问题
1,有些时候smallIcon无效,可能原因是图片太大,换成32*32的就可以了。但魅族除外。
2,在5.0以上的系统中,smallIcon会被系统转换成白色,无论是什么颜色。因此,为防止成为一个白色方块,在设计smallIcon时,应该使用白色和透明。