RemoteViews的介绍:
RemoteViews是一种远程View, 可以在其他进程中显示,可以跨进程更新界面;RemoteViews不能支持所有的View类型,也不能支持自定义View, 只支持如下类型:
layout:
FrameLayout LinearLayout RelativeLayout GridLayout
View:
AnalogClock, button, Chronometer, ImageButton, ImageView ,ProgressBar ,TextView, ViewFlipper ListView , GridView ,StackVie,AdapterViewFlipper,ViewStub;
RemoteViews没有提供findViewById方法;不能直接访问里面View的元素,必须要通过RemoteViews提供的set方法进行完成;
对于点击事件 ,RemoteViews中只支持PendingIntent ,不支持onClicklistener
RemoteViews在Android中的使用场所有两种:通知栏和桌面小部件;
RemoteViews在通知栏上的应用:
定义Notification,会使用默认的布局,如果要使用自定的布局,需要给notification.contentView = remoteView指定remoteview,然后通过remoteView去更新界面
系统自带的布局:
// 创建通知消息对象
NotificationCompat.Builder builder = new NotificationCompat.Builder(YouRen.getContext());
builder.setTicker("您有一条新消息。");// 弹出的提示
builder.setContentTitle(appName);// 通知消息的标题
builder.setContentText(content);// 通知消息的内容
builder.setSmallIcon(smallIcon1);
builder.setLargeIcon(appIcon);
builder.setDefaults(Notification.DEFAULT_ALL);
builder.setWhen(System.currentTimeMillis());
builder.setAutoCancel(true); //注意不要设置setAutoCancel为true,否则监听器接收不到。
PendingIntent contentIntent = PendingIntent.getBroadcast(this, NOTIFY_REQUEST_CODE, intent_bro, PendingIntent.FLAG_UPDATE_CURRENT);//第一个参数是当前的类 , 第二个参数默认是0,第三个是intent ,可以用于手动清除通知时发送广播 , 第四个pendingIntent的属性
//显示通知
NotificationManager manger = (NotificationManager)this.getSystemService(Context.NOTIFICATION_SERVICE);
manger.notify((int) System.currentTimeMillis(), builder.build());
自定义布局:
RemoteViews在桌面小部件的应用:
AppWidgetProvider 是Android用来实现桌面小部件的类;本质就是一个BroadcastReceiver, 实现功能需要继承AppWidgetProvider类,并重写onUpdate方法。AppWidgetProvider还有onEnabled,onDisabled,onDeleted以及onReceive ,而onReceive可以自动根据广播的Action来调用其余的几个方法。桌面小部件的更新也需要用到RemoteViews,更新方法主要是调用AppWidgetManager的updateAppWidget方法,传入appWidgetId跟RemoteViews。桌面小部件实现步骤如下:
1、定义小部件界面:
2、定义小部件配置信息:
3、定义小部件的实现类:
4、在AndroidManifest.xml中声明小部件:
第一个action用于识别小部件的单击行为;
第二个action作为小部件的标识必须存在,这是系统的规范。
PendingIntent的四个属性:
FLAG_ONE_SHOT:
在当前的pendingIntent中只能被调用一次 , 然后它就会被自动cencel , 如果后续还有相同的pendingIntent , 那么它们的send方法就会调用失败。如果用了这个属性 , 那么同类的通知栏只能使用一次 , 后续的通知栏单击后将无法打开。
FLAG_NO_CREATE:
如果当前系统中不存在相同的PendingIntent对象,系统将不会创建该PendingIntent对象而是直接返回null。(我没用过)
FLAG_CANCEL_CURRENT:
在当前的pendingIntent中如果已经存在 , 那么它们都会被cencel, 然后系统会创建一个新的pendingIntent 。对于通知栏中,那些被cencel的消息将无法打开。使用这个属性时你会发现,当你点击消息1时,没反应,当你点击第2条时就可以点击。
FLAG_UPDATE_CURRENT:(用的比较多)
在当前的pendingIntent中,如果已经存在那么它们都会被更新,即它们的intent中的extras会被替换成最新的;使用这个熟悉的时候 , 可以根据不同的变量来进行辩论,例如好友请求,判断是不是字段为“张三”,如果为张三,那么通知栏只会显示一条,否则会显示多条;