RemoteViews简介与问答

RemoteViews不是当前进程的View,是属于SystemServer进程.应用程序与RemoteViews之间依赖Binder实现了进程间通信.RemoteViews使用最多的场合是通知栏和桌面小插件.

RemoteViews运行在SystemServer进程,更新RemoteViews要通过Binder获取到对应的服务然后调用RemoteViews内部的apply方法加载更新布局.

什么是RemoteView?

其实就是一种特殊的view结构,这种view 能够跨进程传输。并且这种remoteview 还提供了一些方法 可以跨进程更新界面。具体在android里面 一个是通知 一个是桌面小部件。

这2个就是remoteview 最直接的应用了

小部件开发大概流程如何?

android的小部件开发就全都是用的remoteviews。其实就是一个广播接收器+ui显示

remoteView 支持所有的view类型吗?

remoteview仅仅支持少部分系统自带的view。开发者的自定义view是一律都不支持的。

简述remoteViews的原理?

通知栏和widget 都是运行在 NotificationManagerService和AppWidgetService的,并且是在systemt server进程中。我们在apk代码里使用notificationmanager或者appwidgetmanager实际上都是通过binder 来进行与system server的进程间通信的。

public class RemoteViews implements Parcelable, Filter {

可以看到remotviews是继承了Parcelable接口。所以这个remoteviews会通过binder 传递到system server 这个系统进程里。然后系统进程会解析这个remotview 拿到他的包名和布局文件等信息 然后就通过layoutInflater 来加载这个布局了。

对于system server来说  remoteview就好像是自己这个进程里的 资源一样,而对于调用者 也就是我们自己的apk程序员来说,这个view就显然是remoteviews 远程的了。并且值得注意的是,view的更新操作 是由action对象的apply方法来执行的!这一点千万要记住。

基本流程就是这样,另外注意apply和reapply的区别,后者只更新界面 而前者还要加载布局。

除了通知和widget 我们还能怎样使用remoteviews?

remoteview既然是被设计用来跨进程更新ui的。所有跨进程更新ui的场景都可以使用他来做,这里给出2个范例。

第一个范例:同一个apk下,2个进程 ,其中一个activity另外一个activity的ui。

你可能感兴趣的:(RemoteViews简介与问答)