一、RemoteViews的应用
RemoteViews在实际的开发中,主要用在通知栏和桌面小部件的开发过程中。通知栏每个人都不陌生,主要是通过NotificationManager的notify方法去实现的,它除了默认效果外,还可以另外自定义布局。桌面小部件则是通过AppWidgetProvider来实现的,AppWidgetProvider本质上就是一个广播。通知栏和桌面小部件的开发过程中都会用到RemoteViews,它们在更新界面时无法像在Activity里面那样直接更新View,这是因为两者的界面都运行在其它进程中,确切来说是系统的SystemService进程。为了跨进程更新界面,RemoteViews提供了一系列的set方法,并且这些方法只是View全部方法的子集,另外RemoteViews中所支持的View类型也是有限的。
下面简单介绍下RemoteViews在通知栏和桌面小部件中的使用方法。
1.RemoteViews在通知栏上的应用
首先来看下通知栏,我们先了解一下系统默认的样式
String title = "通知标题";
String content = "通知内容";
String id = "channel_id_01";
String name="channel_id_01_name";
Context context = getApplication();
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//解决android9.0上通知不显示的问题。
NotificationChannel mChannel = new NotificationChannel(id, name, NotificationManager.IMPORTANCE_LOW);
notificationManager.createNotificationChannel(mChannel);
Intent intent = new Intent(this, testCustomViewActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
//新的sdk中找不到这个方法了。会报错
//notification.setLatestEventInfo(this, "Test", "This is Notification", pendingIntent);
notification = new Notification.Builder(context)
.setChannelId(id)
.setContentTitle(title)
.setContentText(content)
.setContentIntent(pendingIntent)//设置跳转到指定的activity
.setAutoCancel(true)//设置点击跳转后自动清除消息
.setSmallIcon(R.mipmap.ic_launcher).build();
} else {
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context)
.setContentTitle(title)
.setContentText(content)
.setSmallIcon(R.mipmap.ic_launcher)
.setOngoing(true);
notification = notificationBuilder.build();
}
notificationManager.notify(1008, notification);//注意第一个参数如果是一个常量,那么每次通知都覆盖。如果每次都不同,在通知栏就会出现多个消息
上面会弹出一个系统的默认的通知(兼容了android9.0)。点击通知的时候会跳转到指定的activity,并且清除本身。
效果如下:
为了满足个性化需求,我们还可能会用到自定义通知。自定义通知也很简单,首先我们要提供一个布局文件,然后通过RemoteViews来加载这个布局文件改变通知的样式,代码如下所示:
String id = "channel_id_01";
String name="channel_id_01_name";
Context context = getApplication();
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//解决android9.0上通知不显示的问题。
NotificationChannel mChannel = new NotificationChannel(id, name, NotificationManager.IMPORTANCE_LOW);
notificationManager.createNotificationChannel(mChannel);
/** 生成跳转的intent */
Intent intent = new Intent(this, testCustomViewActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
/** 构造RemoteView */
RemoteViews remoteViews = new RemoteViews(getPackageName(),R.layout.layout_notification);
remoteViews.setTextViewText(R.id.tv_title,"自定义标题_Hello");
remoteViews.setTextViewText(R.id.tv_content,"自定义内容_welcome to android world");
remoteViews.setImageViewResource(R.id.iv_img,R.mipmap.ic_launcher);
remoteViews.setOnClickPendingIntent(R.id.bt_confirm,pendingIntent);//给自定义view的按钮设置一个跳转监听,如果不设置,点击按钮就跳转不了
notification = new Notification.Builder(context)
.setChannelId(id)
.setCustomContentView(remoteViews)//设置自定义的布局
.setContentIntent(pendingIntent)//设置跳转到指定的activity。这个和上面那个按钮的跳转都是生效的。
.setAutoCancel(true