如何让appwidget开机后自动添加到Home Screen上

最近一直在研究android2.2的系统源码,由于项目中的需求, 有个项目需求就是需要让appwidget开机后自动添加到Home Screen上中。

现在终于算是搞定了, 来说说我的做法吧。


我是在Lanucher2系统主题源码上做的修改,其实想想还是挺简单的。 首先把你需要显示的appwidget的apk包放入到system/app目录下,至于如何放,我这里讲解两种方式:

         一:用命令adb push到/system/app下面,但要注意,因为system目录初始权限是只读的,所以你得把system改成读写的,至于如何修改,adb remount 一下 重新mount分区的命令,让system分区从只读变成可读可写既可。


         二:你可以直接把appwidget的apk包放入~/device/you-productname/prebuilt/packages/目录下面,然后进行make,这样appwidget的apk包就会~/out/target/product/imx51_bbg/system/app目录下面了,但这种方式因每个编译规制的不同则相应的路径也会不同。这种方式仅供参考。


如果想不要安装就能像系统的widget那样,直接出现在menu->窗口小部件里面,可以把widget的java文件放入底层的 frameworks文件夹下的widget文件夹中, 然后在appwidget文件夹下的那些文件做些修改,至于如何做修改,网上也有详细说明, 这样就可以类似系统widget一样添加进去了。

安装好了widget的apk,就可以开始在主题源码上做修改了。

下面介绍两种方式,一是直接在/res/xml文件夹下的default_workspace.xml文件下做修改,修改的方式:

<appwidget 
launcher:packageName="..." //widget的packageName
launcher:className=" ..." //实现 widget的 receiver 类的名称.
launcher:container="..." //放置的位置(只能为desktop)
launcher:screen="..." //放置在第几屏上
launcher:x="..." //放置的x位置
launcher:y="..." //放置的y位置
launcher:spanx="..." //在x方向上所占格数
launcher:spany="..."/> //在y方向上所占格数

二是在LauncherProvider下面类似添加clockwidget一样的方式,然后像方法一 /res/xml文件夹下的default_workspace.xml文件下做修改。


做完修改之后,把主题生成的apk包,按照Push widget的方式push到/system/app下面。


这样不出意外的话,就可以看到实现效果了。 如果需要反复测试,请先将/data/data/安装的主题包名/database/launcher.db数据库删除。
以防有缓存数据存在。

如果没有看到效果可能有以下两种情况导致,特别是那些在模拟器上面做测试的情况下。这是怎么回事呢,主要是android系统把你自己的launcher当作一个非安全模式来处理了(既isSafeMode为false),这段代码你可以在LauncherModel.java中的loadWorkspace方法中找到,所以在你自己的launcher启动的时候系统会把你预添加的那些widget给删除了。代码如下

if (!isSafeMode && (provider == null || provider.provider == null || provider.provider.getPackageName() == null)) { Log.e(TAG, "Deleting widget that isn't installed anymore: id=" + id + " appWidgetId=" + appWidgetId); itemsToRemove.add(id); }

所以导致我们加载widget失败。

 

如果我们自己烧一个版本放在终端设备上面那么我们就不会出现这样的问题了。

 

你可能感兴趣的:(android,数据库,测试,null,System,frameworks)