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

      網友投稿 1371 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位置

      這個是搜索欄的配置,因為我這里不需要用到搜索欄,所以把它去掉了,如果需要配置可以使用上面的屬性標簽。

      至于文件夾,在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)

      {

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

      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小時內刪除侵權內容。

      上一篇:微服務架構下請求調用失敗的解決方案
      下一篇:跨平臺數據備份工具之restic
      相關文章
      亚洲乱码在线播放| 亚洲精品视频专区| 亚洲日本乱码卡2卡3卡新区| 久久久久久久亚洲Av无码 | 亚洲AV无码久久精品成人| 国产精品亚洲综合专区片高清久久久 | 国产亚洲AV夜间福利香蕉149| 亚洲AV中文无码乱人伦在线视色| 国产青草亚洲香蕉精品久久| 亚洲aⅴ天堂av天堂无码麻豆| 欧美亚洲精品一区二区| 亚洲国产精品无码久久| 亚洲成a∧人片在线观看无码| 亚洲AV永久无码精品放毛片| 在线91精品亚洲网站精品成人| 高清在线亚洲精品国产二区| 亚洲国产成人久久综合区| 亚洲国产精品成人久久蜜臀 | 亚洲国产一区视频| 亚洲人成无码网WWW| 久久久亚洲精品蜜桃臀| 国产精品亚洲а∨无码播放| 亚洲国产另类久久久精品| 亚洲AV成人片色在线观看高潮| 亚洲一区二区电影| 亚洲日产2021三区在线| 性xxxx黑人与亚洲| 亚洲成熟丰满熟妇高潮XXXXX| 麻豆亚洲AV成人无码久久精品| 亚洲国产精品丝袜在线观看| 久久亚洲色一区二区三区| 亚洲精品国偷自产在线| 亚洲日本一区二区| 亚洲国产成人资源在线软件| 亚洲中文字幕无码mv| 337P日本欧洲亚洲大胆精品| 亚洲日韩在线中文字幕第一页| 国产亚洲综合久久系列| 911精品国产亚洲日本美国韩国| 亚洲一卡2卡4卡5卡6卡残暴在线| 亚洲精品欧美综合四区|