Android中 RemoveView的使用和举例 —— 最全面的APP通知栏适配(8.0通知栏适配)
目录
RemoteViews应该是一种远程View,与其这样不如叫远程服务可能比较好理解,但是远程View的确没听说过,其实它和远程Service是一样的,RemoteViews表示的是一个View结构,它可以在其他进程中显示,由于它在其他进程中显示,为了能够更新它的界面,RemoteViews提供了一组基础的操作用于跨进程更新它的界面。
RemoteViews在Android中的使用场景有两种:通知栏和桌面小部件;
主要是通过NotificationManager的notify方法来实现的,它除了默认效果外,还可以另外定义布局。桌面小部件则是通过AppWidgetProvider来实现的AppWidgetProvider本质上是一个广播。通知栏和桌面小部件的开发过程中都会用到RemoteViews,它们在更新界面时无法像在Activity里面那样去直接更新View,这是因为二者的界面都运行在其他进程中,确切来说是系统的SystemServer进程。为了跨进程更新界面,RemoteViews提供了一系列set方法,并且这些方法只是View全部方法的子集,另外RemoteViews中所支持的View类型也是有限的
Notification,俗称通知,是一种具有全局效果的通知,它展示在屏幕的顶端,首先会表现为一个图标的形式,当用户向下滑动的时候,展示出通知具体的内容。
因为Android的快速发展,而Android的版本也快速的升级导致了一些兼容性的问题。对于Notification而言,Android3.0是一个分水岭,在其之前构建Notification推荐使用NotificationCompate.Builder,它位于android.support.v4.app.NotificationCompat.Builder,是一个Android向下版本的兼容包,而在Android3.0之后,一般推荐使用Notification.Builder构建。本博客主要介绍的是Android8.x的开发
使用系统默认的样式弹出一个通知是很简单的简单示例:
/**
* 版本N之前发送通知消息
*/
private void showNotictionN() {
Bitmap btm = BitmapFactory.decodeResource(getResources(),
R.mipmap.image_a2);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
RemoteViewDemoActivity.this).setSmallIcon(R.mipmap.image_a3)
.setContentTitle("a new message title")
.setContentText("the context of the new message");
//第一次提示消息的时候显示在通知栏上
mBuilder.setTicker("New message");
//设置桌面图标红点显示未读消息数为12,如果不需要显示红点请去掉这段代码
mBuilder.setNumber(12);
mBuilder.setLargeIcon(btm);
//自己维护通知的消失
mBuilder.setAutoCancel(true);
//构建一个Intent
Intent resultIntent = new Intent(RemoteViewDemoActivity.this, MainActivity.class);
//封装一个Intent
PendingIntent resultPendingIntent = PendingIntent.getActivity(
RemoteViewDemoActivity.this, 0, resultIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
// 设置通知主题的意图
mBuilder.setContentIntent(resultPendingIntent);
//获取通知管理器对象
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(0, mBuilder.build());
}
- PendingIntent
对于一个通知而言,它显示的消息是有限的,一般仅用于提示一些概要信息。但是一般简短的消息,并不能表达需要告诉用户的全部内容,所以需要绑定一个意图,当用户点击通知的时候,调用一个意图展示出一个Activity用来显示详细的内容。而Notification中,并不使用常规的Intent去传递一个意图,而是使用PendingIntent。
先来说说Intent和PendingIntent的区别,PendingIntent可以看做是对Intent的包装,通过名称可以看出PendingIntent用于处理即将发生的意图,而Intent用来用来处理马上发生的意图。而对于通知来说,它是一系统级的全局通知,并不确定这个意图被执行的时间。当在应用外部执行PendingIntent时,因为它保存了触发应用的Context,使得外部应用可以如在当前应用中一样,执行PendingIntent里的Intent,就算执行的时候响应通知的应用已经被销毁了,也可以通过存在PendingIntent里的Context照常执行它,并且还可以处理Intent说带来的额外信息。
PendingIntent提供了多个静态的getXxx()方法,用于获得适用于不同场景的PendingIntent对象。一