Launcher3添加桌面appWidget

简介: 这是安卓系统移植开发--Launcher3在桌面上添加默认的appWidget

这是安卓系统移植开发--Launcher3在桌面上添加默认的appWidget


为什么有这篇文章


Launcher3相对于Launcher2改变了很多,网上大部分的资料也是说的4.4版本以前的Launcher2,按照以前Launcher2的修改方式对Launcher3是无效的,比如本文要讲述的在桌面添加appWidget.

上正题


Launcher3桌面的加载过程


Launcher3在首次安装的时候,会检查是否存在相对应的数据库launcher.db,如果不存在,就会从布局文件default_workspace_xxx.xml加载。如果数据库存在,就不会再加载xml文件了。

下面以default_workspace_4x4.xml为例,如下:

<!-- Hotseat -->
<include launcher:workspace="@xml/dw_phone_hotseat"/>
<!--添加widget-->
<resolve    
launcher:screen="0"    
launcher:x="0"   
launcher:y="0"    
launcher:spanX="2"    
launcher:spanY="2">    
<appwidget        
 launcher:packageName="com.android.alarmclock"
launcher:className="com.android.alarmclock.AnalogAppWidgetProvider"      /> />
</resolve>

HotSeat是可以生效的,但是appWidget不显示,尝试了很多种方式,都不行。


解决思路


  1. 前面说了,Launcher3在启动时会把数据加载到数据库中,既然在xml配置文件中不起作用,那么很可能是没有加载到数据库,我导出了数据库,一看,果然没有。
  2. 既然不能自动加载,那么我们是不是可以手动插入一条数据呢?尝试了一下,是行得通的。


方案代码


步骤一

workspace的展示需要两个重要的过程,loadWorkspace()和bindWorkspace(),顾名思义分别是加载workspace需要的数据和数据与workspace的位置绑定的两个方法。这两个过程在LauncherModel.java文件中。我们需要在loadWorkspace()方法中把数据添加进去。具体在哪个位置呢?在loadWorkspace()方法有一行

LauncherAppState.getLauncherProvider().loadDefaultFavoritesIfNecessary();

的后面。

代码:

LauncherAppState.getLauncherProvider().loadDefaultFavoritesIfNecessary();
//在这里进行添加--bianjb
//在这里添加一条数据,应该可以的--bianjbLauncherProvider.DatabaseHelper helper = new LauncherProvider.DatabaseHelper        (context);
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("_id", 5);//id号
values.put("container", -100);//窗口,workspace是-100
values.put("cellX", 0);//x坐标
values.put("cellY", 0);//y坐标
values.put("spanX", 4);//x扩展
values.put("spanY", 4);//y扩展
values.put("itemType", 4);//类型为4,根据你要添加的进行调整
//appWidgetProvider也是需要要添加哪个widget进行调整
values.put("appWidgetProvider", "com.android.deskclock/com.android.alarmclock" +        ".DigitalAppWidgetProvider");
values.put("modified", 0);//上一次修改时间,可以不写
values.put("restored", 0);
values.put("profileId", 0);
values.put("rank", 0);
values.put("options", 0);
long insert = db.insert(LauncherProvider.TABLE_FAVORITES, null, values);
db.close();
Log.e("LauncherModel", insert > 0 ? "插入成功" : "插入失败");

步骤二

注意了,这里我们使用了DataBaseHelper来创建数据库,这个类是LaucherProvider的内部类,源代码中是private,所以我们还需要修改该类为public

步骤三

因为我们手动添加到数据库,在加载过程中会检查是否有对应的screenId,而此时保存screenId的集合是空的。这部分检查代码是由LauncherModel的checkItemPlacement()方法来完成的,仔细阅读代码就会发现,真正保存screenId的集合是由一个变量叫做sBgWorkspaceScreens的变量保存,我们只需要在checkItemPlacement方法调用前为它手动添加一个长整形0L,就可以了。


目录
相关文章
|
6月前
|
Java Android开发
Android桌面快捷方式图标生成与删除 使用Intent与launcher交互
Android桌面快捷方式图标生成与删除 使用Intent与launcher交互
114 1
|
Android开发
[√]android创建通知栏
[√]android创建通知栏
87 1
|
API Android开发
[√]Android 通知栏
[√]Android 通知栏
51 0
|
XML Android开发 数据格式
Android之在launcher里面动态加载桌面图标
Android之在launcher里面动态加载桌面图标
224 0
|
XML Android开发 数据安全/隐私保护
|
前端开发 Android开发
Android 桌面生成快捷方式
Android生成桌面快捷方式的几种方法:   //------------以下为动态替换桌面应用Icon的一种解决方案------------------- // 1.获取本地目录图片的Bitmap ;根据Bitmap绘制新的canvas画布Jicanvas画布上添加文字...
970 0
|
XML Android开发 数据格式
Android桌面小部件AppWidget(2)
 Android桌面小部件AppWidget(2) 在附录文章1的基础上,我再写一篇关于Android AppWidget的文章,本篇文章实现一个简单功能,此功能亦是对附录文章1所实现功能的增强和改进,本文的代码实现的功能:假设桌面小部件只包含一个Button和一个TextView,当点击Button后,后台启动一个服务(IntentService实现),该服务每个一秒发送一个简单的字符串消息数据data,然后将此消息数据更新到桌面小部件的TextView里面实时显示。
1068 0