AndroidLauncher分析和修改1——Launcher默认界面配置(default_workspace)

网友投稿 1034 2022-05-29

www.cnblogs.com/mythou/p/3153880.html

最近工作都在修改Launcher,所以打算把分析源码和修改源码的过程记录下来,最近会写一些关于Launcher的分析和修改博文。因为我是修改4.0.3的Launcher,所以后面文章里面的Launcher都是基于Android4.0.3的Launcher2修改。Launcher源码比较多,而且里面应用了很多设计模式,要把它分析清楚要花不少精力,网上也有一些零碎的分析文章,不过关于修改的文章不多。所以打算写一些分析和修改Launcher结合的文章。

原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3153880.html

今天主要是分析修改Launcher的默认界面如何配置和修改。Launcher修改是最近才开始,下面两张图片是最近修改后的结果。因为程序是用于车载导航仪的,所以界面和一般的手机界面差别较大。改动也比较大,不过对于Launcher的分析修改都是通用的。

这是基于Android4.0.3修改后的Launcher界面,因为程序是用在汽车导航上,所以图标做了放大操作。删除了一些不需要的东西。

下面针对界面修改的地方做分析。

1、界面默认配置文件

机器刚升级的时候,Launcher的界面是默认读取一个xml配置文件,完成配置工作。这个配置文件在Launcher目录下,

路径是:\Launcher\res\xml\default_workspace.xml 。这个XML文件就是刚升级,Launcher第一次显示的时候,会读取的配置文件。

default_workspace。xml里面可以配置APP快捷方式、Widget、Search搜索栏等。下面就常用的这几个属性进行解析:

//Edited by mythou

//http://www.cnblogs.com/mythou/

快捷方式说明

launcher:className="com.apical.radio.radioMainActivity" //该应用的类,点击图标时,需要启动的类

launcher:packageName="com.apical.radio" //该应用的包名

launcher:screen="1" //第1屏,0-4屏共5屏

launcher:x="0" //图标X位置,左上角第一个为0,向右递增,0-4共5个

l0auncher:y="0" //图标Y位置,左上角第一个为0,向下递增,0-2共3个

/>

//Edited by mythou

//http://www.cnblogs.com/mythou/

//桌面Widget的标签

launcher:className="de.dnsproject.clock_widget_main.Clock1AppWidgetProvider" //该应用的类

launcher:packageName="de.dnsproject.clock_widget_main" //该应用的包名

launcher:screen="1" //第1屏,0-4屏共5屏

launcher:x="2" //图标X位置,左上角第一个为0,向左递增,0-4共5个

launcher:y="1" //图标Y位置,左上角第一个为0,向下递增,0-2共3个

launcher:spanX="3" //在x方向上所占格数

launcher:spanY="2" /> //在y方向上所占格数

minWidth = 72*占用格数-2里面的占用格数就是上面launcher:spanX和launcher:spanY配置的数目。针对上面的效果图,就是占用了3个横向的格子,2个竖向的格子。minWidth应该等于214。

launcher:screen="1" //第2屏

launcher:x="0" //图标X位置

launcher:y="1"/> //图标Y位置

这个是搜索栏的配置,因为我这里不需要用到搜索栏,所以把它去掉了,如果需要配置可以使用上面的属性标签。

Android之Launcher分析和修改1——Launcher默认界面配置(default_workspace)

至于文件夹,在4.0的Launcher里面是支持的,分析加载函数里面,可以找到解析文件夹标签的方法。

上面界面默认配置就是通过使用上面的标签修改default_workspace.xml配置的。

下面列出default_workspace支持的标签和属性:

//Edited by mythou

//http://www.cnblogs.com/mythou/

//default_workspace.xml中,支持的标签有:

favorite:应用程序快捷方式。

shortcut:链接,如网址,本地磁盘路径等。

search:搜索框。

clock:桌面上的钟表Widget

//支持的属性有:

launcher:title:图标下面的文字,目前只支持引用,不能直接书写字符串;

launcher:icon:图标引用;

launcher:uri:链接地址,链接网址用的,使用shortcut标签就可以定义一个超链接,打开某个网址。

launcher:packageName:应用程序的包名;

launcher:className:应用程序的启动类名;

launcher:screen:图标所在的屏幕编号;

launcher:x:图标在横向排列上的序号;

launcher:y:图标在纵向排列上的序号;

Launcher里面负责解析default_workspace.xml文件的方法是 LauncherProvider.java里面的loadFavorites方法。

2、LauncherProvider.java的loadFavorites分析:

//Edited by mythou

//http://www.cnblogs.com/mythou/

//传入default_workspace文件的资源ID和数据库实力,把xml里面数据解析,保存到Launcher数据库。返回总共解析了多少个标签。

private int loadFavorites(SQLiteDatabase db, int workspaceResourceId) {

//.........

int type;

while (((type = parser.next()) != XmlPullParser.END_TAG ||

parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT)

{

if (type != XmlPullParser.START_TAG) {

continue;

}

boolean added = false;

final String name = parser.getName();

TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.Favorite);

long container = LauncherSettings.Favorites.CONTAINER_DESKTOP;

if (a.hasValue(R.styleable.Favorite_container)) {

container = Long.valueOf(a.getString(R.styleable.Favorite_container));

}

String screen = a.getString(R.styleable.Favorite_screen);

String x = a.getString(R.styleable.Favorite_x);

String y = a.getString(R.styleable.Favorite_y);

// If we are adding to the hotseat, the screen is used as the position in the

// hotseat. This screen can't be at position 0 because AllApps is in the

// zeroth position.

if (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT

&& Integer.valueOf(screen) == allAppsButtonRank) {

throw new RuntimeException("Invalid screen position for hotseat item");

}

values.clear();

values.put(LauncherSettings.Favorites.CONTAINER, container);

values.put(LauncherSettings.Favorites.SCREEN, screen);

values.put(LauncherSettings.Favorites.CELLX, x);

values.put(LauncherSettings.Favorites.CELLY, y);

//解析xml里面的标签,从这里可以找到支持的标签类型和相关属性参数。

if (TAG_FAVORITE.equals(name)) {

long id = addAppShortcut(db, values, a, packageManager, intent);

added = id >= 0;

} else if (TAG_SEARCH.equals(name)) {

added = addSearchWidget(db, values);

} else if (TAG_CLOCK.equals(name)) {

added = addClockWidget(db, values);

} else if (TAG_APPWIDGET.equals(name)) {

added = addAppWidget(parser, attrs, type, db, values, a, packageManager);

} else if (TAG_SHORTCUT.equals(name)) {

long id = addUriShortcut(db, values, a);

added = id >= 0;

} else if (TAG_FOLDER.equals(name))

{

//.........

//folder属性里面的参数要多于2个,才能形成文件夹。

if (folderItems.size() < 2 && folderId >= 0) {

// We just delete the folder and any items that made it

deleteId(db, folderId);

if (folderItems.size() > 0) {

deleteId(db, folderItems.get(0));

}

added = false;

}

}

if (added) i++;

a.recycle();

}

//.........

return i;

}

其实就是一个分析XML和写入数据库的过程,LauncherProvider.java是整个Launcher的数据来源,十分重要,后面我再具体分析数据加载和适配显示方面的逻辑。

另外还有一个问题补充一下,就是有关Android截图问题,因为我开发的机器不能使用USB调试,而且没有摇动之类的传感器,很多手机上截图方法都用不了,查了一下,可以使用screencap命令来截图,具体方法可以参考我另外一篇文章:http://www.cnblogs.com/mythou/p/3152627.html

至于图标加入默认背景或者强制转换APP快捷方式图标,修改图标大小和行列数,以及如何配置默认背景,明天再写另外文章说明。

Android HTTP 数据库

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微服务架构下请求调用失败的解决方案
下一篇:正点原子:STM32F103(战舰)、STM32F407(探索者)、STM32F103(MINI)原理图和PCB
相关文章