launcher widget如何加载自定义视图
来源:互联网 发布:手机淘宝6.5.0旧版本 编辑:程序博客网 时间:2024/05/01 12:08
有关launcher的widget加载的过程可以参考下图,主要介绍了从AppWidgetProvider到RemoteViews的整个流程,但是没有画出Launcher是如何显示widget的布局,以及LayoutInflater是如何加载布局的xml的。
在Launcher加载widget的布局,android主要做了两方面的限制:(1)widget布局中的视图类必须含有RemoteViews的标注;(2)视图类必须是android.view和android.widget包下的视图类,即第三方不能在widget布局中自定义视图类。那如何在widget布局中加载第三方自定义控件呢?答案就是在上图的RemoteViews到LayoutInflter之间想办法,因为上述两个限制都是在LayoutInflater中判断的,所以我们就可以想一个绕过限制并且不影响其他布局加载的方法。
如何在LayoutInflater中绕过上述的限制呢?首先,我们需要分析LayoutInflater是如何加载布局的,如下图所示:
在LayoutInflater类的createView()方法中,通过ClassLoader类调用loadClass()方法就可以创建视图类。这里有一个问题ClassLoader类是怎么得到的,也许你会说这很简单,直接通过Context.getClassLoader()方法得到。但是又引出另一个问题,LayoutInflater类中的Context是哪个上下文呢?从不同的地方请求LayoutInflater的服务都会传递不同的context给它,此时我们要回想我们的初衷,我们的初衷是什么?我们初衷就是在launcher加载自定义的视图类,所以我们请求LayoutInflater的服务时传递给它的Context是launcher的上下文。
通过launcher的context去获得第三方apk(假设是音乐apk)自定义视图类是拿不到的,一定会报class not found的错误。这跟android的类加载有关, ClassLoader跟package是绑定的,在LoadApk类中我们可以看到相关的代码。因此我们需要拿到第三方apk的Context对象才能获得相应的ClassLoader才能加载自定义的视图类。以下是修改前createView()方法中的一段代码:然后附上修改后的一段代码:
通过对比修改前后的代码,我们发现使用createPackageContext创建第三方apk的Context,这样就可以加载第三方自定义的视图类了。为了安全起见,需要根据实际情况限制apk的权限。另外在性能方面,我们知道LayoutInflater的加载过程是相当耗时的,所以我们不应该增加LayoutInflater的负担,这也是android为什么会自己实现解析xml文件类XmlPullParser。
- launcher widget如何加载自定义视图
- 自定义widget导致Launcher进程崩溃
- Launcher如何加载数据
- Launcher预设Widget
- Android launcher widget配置
- 修改Launcher3代码--在加载Launcher时默认加载某个widget
- 自定义网络加载视图NetworkImageView
- 自定义launcher的预置widget时总是出现绑定失败的解决办法(bindAppWidgetIdIfAllowed)
- Key Launcher上底下的shortcut如何修改默认值以及如果修改Key Launcher上widget的默认显示顺序
- launcher widget 添加过程分析
- iOS自定义加载等待视图-MBProgressHUD
- iOS在Xib加载自定义Xib视图
- 点击cell中的按钮加载自定义视图
- Android 自定义加载效果视图(loading)控件
- 探秘widget之launcher添加widget的流程分析
- 探秘widget之launcher添加widget的流程分析
- 探秘 widget 之 launcher 添加 widget 的流程分析
- 探秘 widget 之 launcher 添加 widget 的流程分析
- cocos2d-x Lua事件调用 新版本中Rect判断是否包含Point
- 数据结构----主席树
- bzoj1013(高斯消元)
- java死锁详解
- Java += 操作符实质
- launcher widget如何加载自定义视图
- ERROR ITMS-90096: Your binary is not optimized for iPhone 5 错误
- Http请求与响应基础讲解
- 当java碰到防火墙
- 经典算法-统计0~n之间的数字二进制的1的个数
- springMVC-mvc:view-controller path使用方法
- python 随机生成字符串
- POJ 2253 Frogger 每条路径最大边然后选择这些最大边的最小的那个边 题解。。。根本翻译不出来
- javascript 详解document.write()方法