Status bar notification添加一个icon到系统的状态栏中(可选择是否有文本信息),添加一段信息到“Notification”窗口中。
status bar notification用于后台运行的服务需要告知用于一些事件并且得到用户的响应的情况下。后台运行的服务为了及时得到用户的响应不应该自己启动一个activity。而应该创建一个用户选择后可以启动activity的status bar notification。
Status bar 的效果图:
Notification的效果图:
我们通常是通过一个service来创建notifications。这时,即使用户在运行其他的程序或者是设备进入休眠状态的时候,我们依然可以在后台创建notifications。要创建一个notification,我们必须要用到两个类:Notification和NotificationManage。
用Notification类的实例来定义status bar notification的属性,例如:status bar notification的图标、显示的message(信息)以及额外的设置,例如播放的声音。NotificationManager是Android的一项系统服务,通过它可以执行和管理所有的status bar notifications。你不能直接实例化NotificationManager这个类。为了实现自己的Notification,你必须通过getSystemService()方法获得NotificationManager,然后,当你想通知用户的时候,将Notification传递给notify()这个方法,这样就实现了自己的status bar notification。
下面介绍旧的notification用法,这个实例是模拟下载应用
MainActivity中的代码:
public class MainActivity extends Activity implements OnClickListener {
private Button bt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt=(Button)findViewById(R.id.bt);
bt.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt:
Intent intent=new Intent(this,StatusService.class);
startService(intent);
break;
default:
break;
}
}
//设置当点击notification中的事件时,返回Activity后,小图标消失
public void onStart(){
super.onStart();
NotificationManager manager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
manager.cancel(R.layout.activity_main);
}
}
StatusService中的代码:
public class StatusService extends IntentService{
private static final String TAG="StatusService";
public StatusService() {
super("StatusService");
}
@Override
protected void onHandleIntent(Intent intent) {
try {
Log.i(TAG, "文件下载");
showNotification(false);
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
showNotification(true);
Log.i(TAG, "下载完毕");
}
private void showNotification(boolean download) {
if(download){
//创建一个notification对象,并设置图标,提示信息等属性
Notification mynotification=new Notification(R.drawable.head,"应用下载完毕",System.currentTimeMillis());
//创建一个intent,当点击notification中的事件时返回当前Activity
Intent intent=new Intent(this,MainActivity.class);
PendingIntent contentIntent=PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
//设置notification中的属性,标题和内容
mynotification.setLatestEventInfo(this,"1个下载任务", "下载完成是否安装", contentIntent);
//创建一个Manager来管理发送notification
NotificationManager manager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
manager.notify(R.layout.activity_main,mynotification);
}
else{
Notification mynotification=new Notification(R.drawable.head,"开始下载",System.currentTimeMillis());
Intent intent=new Intent(this,MainActivity.class);
PendingIntent contentIntent=PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
mynotification.setLatestEventInfo(this,"1个下载任务", "正在下载中", contentIntent);
NotificationManager manager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
manager.notify(R.layout.activity_main,mynotification);
}
效果图:点击下载,在顶部状态栏中显示
效果图:把状态栏下拉,会看见如下显示
效果图:过一会应用下载完毕
效果图:把状态栏下拉显示
总结:创建流程大致如上面StatusService代码中showNotificaiton方法中注释的那样。
此方法有两个缺点,1.需要在MainActivity中的onStart方法中定义方法,来取消返回时的小图标。2.new Notification()方法和setLatestEventInfo()方法应经过时了。
下面介绍稍微新一点的notification用法:
MainActivity中的代码很简单,就是设置一个button的监听事件和启动Service服务,就不上传了。
StatusService中的代码:
public class StatusService extends IntentService {
private static final String TAG="StatusService";
public StatusService() {
super("StatusService");
}
@Override
protected void onHandleIntent(Intent intent) {
try {
Log.i(TAG, "下载程序");
showNotification(true);
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
Log.i(TAG, "下载完成");
showNotification(false);
}
@SuppressLint("NewApi")
private void showNotification(boolean b) {
if(b){
//用builder类创建一个notification对象
Builder builder=new Notification.Builder(this);
//创建一个intent,当点击notification中的事件时返回当前Activity
Intent intent=new Intent(this,MainActivity.class);
PendingIntent contentIntent=PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
//设置notificaiton中pendingIntent
builder.setContentIntent(contentIntent);
//设置小图标
builder.setSmallIcon(R.drawable.tutu);
//设置下拉列表中的大图标
Resources res=StatusService.this.getResources();
builder.setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.tubiao));
//设置Status bar中的提示信息
builder.setTicker("新版本更新中");
//设置发生的时间
builder.setWhen(System.currentTimeMillis());
//设置当返回当前Activity后,清楚图标
builder.setAutoCancel(true);
//设置下拉列表里的标题
builder.setContentTitle("有1个下载任务");
//设置上下文内容
builder.setContentText("程序正在下载。。。");
//获取创建的Notification对象
Notification notification=builder.getNotification();
//创建一个Manager来管理发送notification
NotificationManager manager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
manager.notify(R.layout.activity_main,notification);
}
else{
Builder builder=new Notification.Builder(this);
Intent intent=new Intent(this,MainActivity.class);
PendingIntent contentIntent=PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(contentIntent);
builder.setSmallIcon(R.drawable.tutu);
Resources res=StatusService.this.getResources();
builder.setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.tubiao));
builder.setTicker("新版本更新完成");
builder.setWhen(System.currentTimeMillis());
builder.setAutoCancel(true);
builder.setContentTitle("有1个下载任务");
builder.setContentText("程序下载完成是否安装");
Notification notification=builder.getNotification();
NotificationManager manager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
manager.notify(R.layout.activity_main,notification);
}
}
}
效果图:Log日志中的打印信息
效果图:当点击download时,如下显示
效果图:把状态栏下拉显示
效果图:过一会,更新完毕
效果图:下拉显示
当返回桌面时,把下拉列表拉出点击该图标,会返回当前Activity,效果图如下:
总结:这个方法中唯一的不足时getNotification()这个方法也过时了,更新的方法以后遇到实际的问题在深入了解了。哪个大神有最最新的方法,能否分享介绍一下啦,谢谢。