通知 / notifications
官网–通知
通常应用会在通知栏显示一些通知,提示任务进度,提示信息,或者推送什么的。
Android有个组件叫Notification
就是创建这样的通知。通知区域就是常见的任务栏,可以下拉显示详细内容,可以点击,也可以收起来忽略之。
创建
可以像一般的类一样创建通知
Notification notif = new Notification(int icon, CharSequence tickerText, long when);
但是这个已经被标记为deprecated了,推荐用Notification.Builder()来创建。
Notification noti = new Notification.Builder(mContext)
.setContentTitle("New mail from " + sender.toString())
.setContentText(subject)
.setSmallIcon(R.drawable.new_mail)
.setLargeIcon(aBitmap)
.build();
下面的设置对应不同的内容。
要显示通知,需要创建一个NotificationManager
,然后调用notify方法
NotificationManager notiManager =
(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
notiManager.notify(mNotiId,notiBuilder.build());
其中mNotiId是一个int类型的标记
当您需要为同一类型的事件多次发出同一通知时,应避免创建全新的通知, 而是应考虑通过更改之前通知的某些值和/或为其添加某些值来更新通知。
当这个id没有更改,那么build出来的notification就还是原来那个,也就是说,新的设置是更新原来的notification。
这样,一个通知就创建了。
设置
1,点击以后通知消失
notiBuilder.setAutoCancel(true);
2,常驻的通知,像手机QQ一样,点击不消失,并且也不能按“清除”按钮清除掉。
notiBuilder.setOngoing(true);
还有更多类似的设置,可以查询Notification.Builder
除此以外,还可以直接设置notification的flag变量
notification.flag = Notification.FLAG_ONGOING_EVENT;
不过,我觉得用builder设置比较直观一点。
点击操作
简单的点击操作可以通过设置一个PendingIntent
来实现
PendingIntent pendingIntent = PendingIntent.getActivity(
thisActivity,
0,
intentChooser,
PendingIntent.FLAG_UPDATE_CURRENT
);
notiBuilder.setContentIntent(pendingIntent);
notiManager.notify(mNotiId,notiBuilder.build());
其中第三个参数就是打开新的Activity的intent
假如是进行一个广播,则需要实用getBroadcast()
方法
设置进度条
如果是一个显示进度的通知,需要显示进度条,Android 4.0以上可以直接调用
builder.setProgress(max, progress, false)
来设置。这样会显示一个进度条,可以查看到完成百分比。
当然,最好是在新的线程里设置。
完成以后,记得设置setProgress(0,0,false)
,然后修改通知栏的信息以提示进度完成。
如果要进度条不显示半分比,而是一个正在进行的动画来表示正在工作,就设置
setProgress(0,0,true)
。这样就并不会显示百分比。完成以后依然需要更新信息来提示完成。
例子
new Thread(
new Runnable() {
@Override
public void run() {
int progress;
for(progress =0;progress<=100;progress+=10)
{
//如果要显示半分比 :
notiBuilder.setProgress(100,progress,false);
//如果要不显示半分比但是有一个明显的正在工作的动画 :
//notiBuilder.setProgress(0,0,true);
notiManager.notify(520,notiBuilder.build());
try {
Thread.sleep(1000);
}catch (InterruptedException e) {
Log.d("septemLog","sleep faild");
}
}
notiBuilder.setContentText("Progress complete.")
.setProgress(0,0,false);
notiManager.notify(520,notiBuilder.build());
}
}
).start();
添加ACTION
可以在通知的下面添加ACTION按钮,来完成一些事件。
builder.addAction(int,charSequence,pendingIntent)
三个参数分别为图标的resourceID,标题,执行动作的pendingIntent.
测试发现,普通style下最多可以添加到3个ACTION,更多的就显示不出来了,如果是mediaStyle,会显示5个。
通常添加按钮是为了做一个音频播放的通知,那么可以通过setStyle(new Notification.MediaStyle())
来把通知栏变得比较像一个播放器。
浮动通知
通信类的APP需要显示浮动通知,就是在屏幕上显示一个信息内容,提供一些进一步的操作。
notiBuilder.setFullScreenIntent(pendingIntent,true);
第二个参数表明,这是一个高优先级的通知。可以根据情况设置。
注意
如果设置了autoCancele(true)
,点击通知内容的时候,通知会自动消失。
在模拟器测试中发现,如果设置了setAction()
添加了按钮以后,点击按钮不会马上消失,会过一会儿自动消失。
所以,如果需要点击以后马上消失,需要设置一个这个按钮的动作是一个intent,这个intent通知当前ACTIVITY把这个消息清除掉。清除就是builder.cancel(mNotifId)。对应id的消息就会清除。
自定义View
如果需要自定义通知的view,就setContent(RemoteViews)
,传入一个RemoteViews
对象,在这个对象中设置好自定义View.
具体怎么实用还没有研究过。