关闭

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

85人阅读 评论(0) 收藏 举报
分类:


最近工作都在修改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/
快捷方式说明
<favorite                                  //程序快捷键属性标签
    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个
/>
复制代码

    Launcher默认是有5个分屏,不过这个可以配置。同样,每行每列有多少图标也是可以配置的,这个在后面会说在哪里可以修改。这里按我修改的是3行5列的界面排布(对应上面的效果图)。一般配置APP的快捷方式,使用上面的属性标签就可以。

 

复制代码
//Edited by mythou
//http://www.cnblogs.com/mythou/
//桌面Widget的标签
<appwidget                                  //插件
    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方向上所占格数
复制代码

     桌面Widget跟桌面快捷方式属性类型,不过这里需要注意launcher:spanX和launcher:spanY 这两个属性是说明Widget多大的,这个和Widget的最小宽高配置有关。我们在编写桌面Widget的时候,需要在XML配置文件里面指定Widget最小的宽和高,一般最小宽高计算公式是(minWidth = 72*占用格数-2) 计算出来,最小高度也是一样。(上面那个模拟时钟是MIUI的时钟)

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

 

<search                       //搜索栏
launcher:screen="1"               //第2屏
launcher:x="0"                    //图标X位置
launcher:y="1"/>                  //图标Y位置

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

 

 

至于文件夹,在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快捷方式图标,修改图标大小和行列数,以及如何配置默认背景,明天再写另外文章说明。

如果有朋友发现哪里写错了,请留言指出,谢谢!

0
0
查看评论

Android Launcher分析和修改——Launcher默认界面配置以及其他的事项

最近工作都在修改Launcher,所以打算把分析源码和修改源码的过程记录下来,最近会写一些关于Launcher的分析和修改博文。因为我是修改4.0.3的Launcher,所以后面文章里面的Launcher都是基于Android4.0.3的Launcher2修改。Launcher源码比较多,而且里面应...
  • lishanmin11
  • lishanmin11
  • 2016-07-24 10:41
  • 992

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

最近工作都在修改Launcher,所以打算把分析源码和修改源码的过程记录下来,最近会写一些关于Launcher的分析和修改博文。因为我是修改4.0.3的Launcher,所以后面文章里面的Launcher都是基于Android4.0.3的Launcher2修改。Launcher源码比较多,而且里面应...
  • wh_19910525
  • wh_19910525
  • 2014-03-13 14:22
  • 15258

Android中Launcher中default_workspace.xml详解

launcher:className="com.apical.radio.radioMainActivity"     //该应用的类,点击图标时,需要启动的类     launcher:packageName=&qu...
  • shishanqing920610
  • shishanqing920610
  • 2016-08-03 23:56
  • 876

Android之Launcher分析和修改2——Icon修改、界面布局调整、壁纸设置

上一篇文章说了如何修改Android自带Launcher2的默认界面设置(http://www.cnblogs.com/mythou/p/3153880.html)。     今天主要是说说Launcher里面图标、布局、壁纸等的设置问题。毕竟我们一般修改Launcher,这些...
  • u011068702
  • u011068702
  • 2016-07-04 17:53
  • 1062

android4.4 Launcher3 修改配置文件default_workspace.xml无效的解决方法

此文章针对的是一整套的系统,并不适合单独下载Launcher3源码下来修改的情况。      最近公司在搞一个车载方案,用的是RK的系统,因为以前一直做的是A6的方案,android4.0的,这次换成RK的,android4.4的,系统代码拿到手的时候,发现...
  • lhp1930
  • lhp1930
  • 2014-12-10 14:07
  • 1622

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

www.cnblogs.com/mythou/p/3153880.html 最近工作都在修改Launcher,所以打算把分析源码和修改源码的过程记录下来,最近会写一些关于Launcher的分析和修改博文。因为我是修改4.0.3的Launcher,所以后面文章里面的Launcher都是基于And...
  • u011068702
  • u011068702
  • 2016-07-04 17:49
  • 715

android 设置默认launcher 附上代码

当系统初始化完毕后会进入homeactivity: 具体代码流程: ActivityManagerService.java --> public void systemReady(final Runnable goingCallback) { ... mMainStack.resumeTopA...
  • jia4525036
  • jia4525036
  • 2014-01-09 11:32
  • 14611

Android 将自己的Launcher设置为默认启动

自己做了个很简单的launcher,但是在设置默认launcher的时候,每次重启机器的时候,就会重新弹出xuan'z
  • bulreed
  • bulreed
  • 2014-06-27 16:12
  • 14105

android 设置默认launcher

本博客基于 Android 7.0,只作为沟通学习使用。 前言 平时使用android手机的时候我们可能会遇到下面的情况,比如:我们有多个浏览器,当我们没有设置哪一个为默认的浏览器并点击了一行网址时,就会弹出一个系统选择框,让用户选择一个浏览来打开这个网址,并且会让用户选择只使用一次还是将你...
  • michael_yt
  • michael_yt
  • 2017-09-27 14:13
  • 747

android 开机默认进入指定Launcher

这里总结下我研究这个需求,想出的两种解决方案。 第一种方法最简单暴力只要修改apk的AndroidManifest直接上源码<activity android:name="com.android.launcher3.Launcher" ...
  • fireness
  • fireness
  • 2015-09-02 14:37
  • 5761
    个人资料
    • 访问:89次
    • 积分:2
    • 等级:
    • 排名:千里之外
    • 原创:0篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档