zoukankan      html  css  js  c++  java
  • RemoteViews的内部机制

    1.RemoteViews的构造方法public RemoteViews(String packageName,int layoutId)

    第一个表示当前应用的包名(反射机制需要),第二个表示加载的布局文件。

    注:RemoteViews不能支持所有View类型。就像下表没有EditTextView,如果在布局文件中则会报错

    所支持类型如下:

    并提供相应的方法:

    二、运作流程

    ①、RemoteViews通过Binder传送到SystemServer ②、系统根据RemoteViews的包名等信息去得到该应用的资源,之后通过LayoutParams去加载RemoteViews的layout文件  ③、系统会对View执行一系列界面更新任务(任务是由set方法提交的)。注:View所做的更新不是立即执行的,必须等到RemoteViews被加载完成后,才会执行,因为是异步。

    扩展:关于③中set传递的任务。当应用每一次调用set方法,就会将一个Action对象添加到RemoteViews中。(Action对象:代表一个View操作,实现了Parcelable方法,系统首先将View操作封装到该对象中,然后通过远程传输到远程进程,远程进程执行Action对象中的方法)。之后通过NotificationManger和AppWidgetManager提交(就是将Action远程传输到远程进程中)

    ④、远程进程会调用RemoteViews的apply方法对所有action对象进行遍历,调用View的apply()方法。

    运行图

    三、对其中一个方法的分析

    详见P233页,将方法,封装到action中。将action对象封保存在ArrayList中。

    P234也,RemoteViews的apply方法:加载RemoteViews中的布局文件,之后通过performApply遍历action对象,并调用其apply方法。

    注:通知栏和桌面小插件在初始化界面时候会用apply方法(加载布局并更新界面),reApply(只会更新界面).P236 对方法的应用

    P237 ReflectionAction源码:通过反射调用View的方法。

    四、RemoteViews的意义(用BroadcastRecevier模拟)

     步骤:①、创建两个Activity ②、在第二个Activity中注册BroadcastRecevier ③、第一个Activity将RemoteViews传递给Broadcast,然后Broadcast调用第二个Activity的遍历方法。

    P241页的解析(未完成)

  • 相关阅读:
    338. Counting Bits
    78. Subsets
    MySQL读写分离
    AESEncryption Aes 加密
    LoopBox 用于包装循环的盒子
    ES 服务器 索引、类型仓库基类 BaseESStorage
    一键压缩脚本
    非常好用的一个分组扩展方法
    快递、拆分、合并、优选逻辑
    Git Extensions 使用小结
  • 原文地址:https://www.cnblogs.com/rookiechen/p/5438407.html
Copyright © 2011-2022 走看看