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。
网友评论