Android进阶(5)| 理解RemoteViews

本节目录

一.RemoteViews的应用

RemoteViews的概念:RemoteViews就是一种在其他进程中显示的View,在实际开发中它主要是用在通知栏和桌面小部件的开发过程中。

1.RemoteViews在通知栏上的应用

当我们需要正在通知栏中自定义通知时,我们可以先提供一个布局文件,然后通过RemoteViews来加载这个布局文件即可改变通知的样式:

Notification notification = new Notification();
notification.icon = R.drawable.ic_launcher;
notifaication.tickerText = "hello world";
notification.when = System.currentTimeMillis();
notification.flags = Notification.FLAG_AUTO_CANCLE;
Intent intent = new Intent(this,Activity1.class);
PendingIntent pendingIntent = PentdingIntent.getActivity(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
RemoteViews remoteViews = new RemoteViews(getPackgeName(),R.layout.Layout_notification);
remoteViews.setTextiewText(R.id.msg,"chapter_5");  //设置文字
remoteViews.setImageViewResource(R.id.icon,R.drawable.icon1);  //设置图标
PendingIntent openActivity2PendingIntent = PendingIntent.getActivity(this,0,new Intent(this,Activity2.class),PendingIntent.FLAG_UPDATE_CURRENT)
remoteViews.setOnClickPendingIntent(R.id.open_activity2,openActivity2PendingIntent);
notification.contentView = remoteViews;
notification.contentIntent = pendingIntent;
NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
manager.notify(2,notification);

从上述代码中可以看出,我们只用传入包名以及布局文件的资源id即可创建出一个RemoteViews对象。关于更新,我们则是使用RemoteViews提供的一系列set方法来完成操作。如果要给一个控件增加点击事件,则需要setOnClickPendingIntent()方法来实现。

2.RemoteViews在桌面小部件上的应用

开发桌面小部件主要分为以下几步:
1)定义小部件的界面(布局信息)
2)定义小部件的配置信息
3)定义小部件的实现类
4)在AndroidManifest.xml中声明小部件

具体的操作过程可以点击这里。

3.PendingIntent概述

概念:PendingIntent表示一种pending状态的意图,就是说接下来有一个Intent会在将来某一个特定的时刻发生。PendingIntent典型的使用场景是给RemoteViews添加单击事件。PendingIntent通过send()和cancel()方法来发送和取消特定的待定Intent。

PendingIntent的三种意图:PendingIntent支持三种意图,启动Activity、启动Service和发送广播,它们分别对应着它的三个接口和方法:

PendingIntent的主要方法

可以看到这三个方法的参数都是相同的,这里来着重介绍一下requestCode和flags。

  • requestCode
    表示PendingIntent发送方的请求码,多数情况下取0即可。同时它也和PendingIntent的匹配规则有关,即当两个PendingIntent的requestCode和内部的Intent都相同时,这两个PendingIntent就是匹配的。

  • flag
    flag主要有以下4个标记位:
    1)FLAG_ONE_SHOT:当前描述的PendingIntent只能被使用一次,然后它会被自动cancel,后续如果有相同的PendingIntent则它们的send()方法会调用失败。
    2)FLAG_NO_CANCEL:当前描述的PendingIntent不会主动创建,如果当前的PendingIntent之前不存在,那么那三个方法会直接返回null。
    3)FLAG_CANCEL_CURRENT:当前描述的PendingIntent如果已经存在,那么它们都会被cancel,系统在后续会创建一个新的PendingIntent。
    4)FLAG_UODATE_CRUUENT:当前描述的PendingIntent如果以及存在,那么它们都会被更新。

二.RemoteViews的内部机制

1.RemoteViews的构造方法

RemoteViews有许多的构造方法,这里只是举出来最常用的一种:public RemoteViews(String packgeNmae,int layout),从参数的名字中就可以看出该方法所需要的两个参数就是当前应用所在的包名和将要加载的布局文件。

2.RemoteViews所支持的View类型

  • layout
    LinearLayout、FrameLayout、RelativeLayout、GridLayout。

  • View
    AnaloClock、Button、TextView、ImageView、ListView、GridView、Chronometer、ImageButton、StackView、ViewStub、ProgressBar。

3.RemoteViews访问View的方法

由于RemoteViews主要是用来操作其他进程的View,所以它无法直接访问里面的View元素,而是需要通过RemoteViews提供的一些列set方法来完成,具体的方法如下:


RemoteViews的set方法

4.RemoteViews的内部运行过程

首先由于RemoteViews实现了Parcelable接口,所以它会先通过Binder传递到SystemServer进程中。接着系统会根据RemoteViews中传入的包名、布局等信息,通过LayoutInflater去加载这些布局文件。接着系统会对View执行一系列界面更新任务,而这些更新任务就是通过之前的set方法来完成的,当RemoteViews被加载完成以后,这些更新操作就会被执行。

Action的概念:在Android系统中由于效率的原因并没有通过Binder去直接支持View的跨进程访问,而是通过Action来进行。Action实现了Parcelable接口。当我们在应用中每调用一次set方法时,RemoteViews中就会添加一个Action的对象,当我们提交更新时,这些Action对象就会被在远程进程中依次执行。

RemoteViews的内部机制

执行方法:当RemoteViews到达远程进程之后,RemoteViews就会调用apply()方法去遍历所有的Action对象并且调用它们的apply()方法,而具体的View更新操作都是由Action中得apply()方法去执行的。

你可能感兴趣的:(Android进阶(5)| 理解RemoteViews)