RemoteViews的理解和应用

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的理解和应用_第1张图片
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的理解和应用_第2张图片
自定义的消息通知栏


RemoteViews在桌面小部件的应用:

AppWidgetProvider 是Android用来实现桌面小部件的类;本质就是一个BroadcastReceiver, 实现功能需要继承AppWidgetProvider类,并重写onUpdate方法。AppWidgetProvider还有onEnabled,onDisabled,onDeleted以及onReceive ,而onReceive可以自动根据广播的Action来调用其余的几个方法。桌面小部件的更新也需要用到RemoteViews,更新方法主要是调用AppWidgetManager的updateAppWidget方法,传入appWidgetId跟RemoteViews。桌面小部件实现步骤如下:

1定义小部件界面:


RemoteViews的理解和应用_第3张图片
layout下的布局

2、定义小部件配置信息:


RemoteViews的理解和应用_第4张图片
xml文件夹下的配置信息

3、定义小部件的实现类:


RemoteViews的理解和应用_第5张图片
上述方法可以进行删除,替换等操作
RemoteViews的理解和应用_第6张图片
结合onreceive()

4、在AndroidManifest.xml中声明小部件:


RemoteViews的理解和应用_第7张图片
两个action是自定义的

第一个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会被替换成最新的;使用这个熟悉的时候 , 可以根据不同的变量来进行辩论,例如好友请求,判断是不是字段为“张三”,如果为张三,那么通知栏只会显示一条,否则会显示多条;

你可能感兴趣的:(RemoteViews的理解和应用)