1. 程式人生 > >Android學習歷程--Launcher整體載入流程總結

Android學習歷程--Launcher整體載入流程總結

本文為自己學習思路的總結若有需要或整理詳細程式碼及細節

一、進入  LauncherApplication -> LauncherAppState -> 進行初始化環境(通過傳遞sContext)、進行事件監聽&&初始化一些環境例如:橫豎屏、當局語言、畫素密度、小部件和快捷圖示資料庫操作物件、應用圖示快取物件、初始化LauncherMode等。



二、在初始化過後,從Launcher的Oncreate方法入手。

    1.LauncherCallbacks -> LauncherExtention() Launcher擴充套件功能 :此時不需要

             設定了LauncherProviderChangeListener監聽,用來監聽LauncherProvider中資料變化,該監聽介面在Launcher中實現。
             LauncherProvider:繼承自ContentProvider(),主要是建立一個數據庫來存放HomeScreen中的資料資訊,並通過內容提供者來實現其他應用對             launcher中資料的訪問和操作。重寫了ContentProvider()中的方法:
             注:在我所看到的MTK的程式碼中該方法為空(表示很懵逼)

    2.checkForLocaleChange(); 檢查Locale當局的變化 

    3.setContentView(R.layout.launcher) 載入佈局(分為橫屏land和豎屏port)

    4.setupViews();// 獲取控制元件並初始化

    5.registerContentObservers();// 註冊內容觀察者,AppWidgetResetObserver,監聽AppWidget是否重置,以便做出響應的處理

    6.mModel.startLoader()//非同步載入桌面的應用快捷圖示、小部件和所有應用圖示

        startLoader在LauncherModel中實現
           執行LoaderTask執行緒的run()方法(在LauncherModel中)分為兩步

               第一步載入和繫結workspace--loadAndBindWorkspace    

                   1.loadWorkspace

                       1)初始化後面要用到的物件例項
                       2)LauncherAppState.getLauncherProvider().loadDefaultFavoritesIfNecessary();  載入預設配置 
                       3)讀取資料庫,獲取需要載入的應用快捷方式和AppWidget 
                         整個讀取的過程是在一個同步程式碼塊中,在此之前我們先看幾個重要的全域性變數,
                        sBgWorkspaceItems--儲存ItemInfo
                        sBgAppWidgets--儲存AppWidget
                        sBgFolders--存放資料夾
                        sBgItemsIdMap--儲存ItemInfo和其Id
                        sBgDbIconCache--應用圖示
                        sBgWorkspaceScreens--儲存Workspace
                         a)遍歷cursor,讀取每一個app資訊,根據itemType不同型別,分類儲存到剛才的幾個變數中。分這幾種型別:ITEM_TYPE_APPLICATION、ITEM_TYPE_SHORTCUT、ITEM_TYPE_SHORTCUT、                                      ITEM_TYPE_APPWIDGET
                         b)讀取完資料庫之後,將需要移除和更新的item進行移除和更新;
                         c)讀取workspace screen資料庫資訊,如果有未使用過的則將其從資料庫中移除。

                   2.bindWorkspace

                       1)不直接使用上面提到的幾個全域性變數,重新定義區域性變數來處理
                       2)根據item中的screenID將items分成當前screen和其他screen,並進行排序
                       3)runnable執行塊,告訴workspace要開始繫結items了,startBinding方法在Launcher中實現,做一些清除工作   startBinding()
                       4)繫結workspace screen    bindWorkspaceScreens(oldCallbacks, orderedScreenIds);
                       5)Workspace繫結完成之後,就是將items、widgets和folders放到上面去    bindWorkspaceItems()
                           a)批量載入itmes
                                回撥到Launcher的bindItems方法
                                根據item的型別,分別載入,首先獲取item資訊,建立快捷圖示,然後將快捷圖示放置到指定位置  addInScreenFromBind()
                                先獲取快捷圖示的父檢視,分Hotseat和Desktop;設定佈局引數,確定快捷圖示放置的位置;父檢視將快捷圖示新增到指定位置,  addViewToCellLayout()
                                最後設定觸控反饋和長安監聽以及拖拽物件的新增。
                           b)載入folder
                                回撥Launcher的bindFolders方法   bindFolders()
                           c)載入widget
                                回撥到Launcher的bindAppWidget方法  bindAppWidget()    
                                最後通知items的繫結完成    finishBindingItems()

               第二步:loadAndBindAllApps

                   1.獲取需要顯示到Launcher中的app列表,建立app圖示     loadAllApps()

                   2.繫結app--       bindAllApplications()將已安裝的app載入到AllAppContainerView上顯示,當點選HotSet中AllApp圖示時就顯示出來了。

                          1)syncPages  是一個抽象方法,在AppsCustomizePagedView中實現

                                  a)生成AppsCustomizeCellLayout物件
                                  b)setupPage,設定page
                                  c)addView,將CellLayout新增到page中

                          2)重新測量,設定當前頁等     measure()

                          3)loadAssociatedPages

                                  先清除不需要載入的pages,然後載入page及items--syncPageItems,也是一個抽象方法在AppsCustomizePagedView中實現,先計算需要放置的位置,然後建立BubbleTextView例項,最後                                  將其新增到page中。整個setApps的過程還是非常長的,最終目的就是將app顯示到所有app列表中。接著會執行onPackagesUpdated,package的更新操作,就不再展開了。Widget也是類似                                  的
                   載入allapp的過程就結束了

三、showFirstRunClings()  展示第一次引導View

四、Launcher.java其他生命週期方法。

相關推薦

Android學習歷程--Launcher整體載入流程總結

本文為自己學習思路的總結若有需要或整理詳細程式碼及細節 一、進入  LauncherApplication -> LauncherAppState -> 進行初始化環境(通過傳遞sContext)、進行事件監聽&&初始化一些環境例如:橫豎屏、當

Android開發:ListView的使用流程總結——基於《第一行程式碼》

進行頁面的ListView佈局: activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.co

Android開發:RecyclerView的使用流程總結——基於《第一行程式碼》

app/build.gradle檔案: //dependencies閉包中新增 compile 'com.android.support:recyclerview-v7:24.2.1' activity_main.xml: <?xml vers

Android學習歷程之改良版容器式完全退出應用程式App

對常用的退出應用程式的改良版容器式方法做一下介紹,主要供新人瞭解,如果有什麼不對之處,歡迎指正。它採用的是建立一個類繼承Application,將app中的所有activity都新增到一個List集合中,再點選退出按鈕時,遍歷集合,直接銷燬所有activity,重點是採用弱引用,避免記憶體洩露問

Android開發:Recycler的使用流程總結——基於《第一行程式碼》

app/build.gradle檔案: //dependencies閉包中新增 compile 'com.android.support:recyclerview-v7:24.2.1' 新增RecyclerView: <android.suppo

Android學習歷程--新聞客戶端實現

要實現新聞客戶端就要知道什麼是json 1.json: JSON:JavaScript 物件表示法(JavaScript Object Notation)。獨立於語言和平臺,比 XML 更小、更快,更易解析。如今JSON資料已經成為了網際網路中

Android學習筆記:高效載入大量Bitmap

許多情況下,我們的應用中需要的圖片大小總是小於圖片的原始大小如果我們不在載入之前做一些處理的話,那麼我們會遇到比如圖片資源佔用大量記憶體的狀況,所以通常在載入圖片之前,我們做一些裁剪工作: 一、讀取Bitmap的維度和型別 BitmapFactory類提供了一些資料解壓方法

android學習歷程——如何修改程式在桌面的圖示和名字

一、修改程式名字  1、建立工程的時候           在Application Name後面填寫的內容就作為apk檔案安裝後在手機桌面的名字 2、修改已有工程的名字 在AndroidManifest.xml中有個主activity的標籤 裡面那個label屬性 

Android學習之圖片非同步載入框架Picasso

原創地址:http://mcode114.com/android/network/picasso/ Picasso Picasso是Square公司開源的一個Android圖形快取庫。可以實現圖片下載和快取功能。僅僅只需要一行程式碼就能完全實現圖片的非同步載入。使用複

Android學習歷程--Activity的四種啟動模式

我們都知道Activity有四種啟動模式,那麼什麼是個啟動模式呢? 所謂的啟動模式就是Activity的啟動策略 啟動模式有4種,分別為standard、singleTop、singleTask、singleInstance; 在講解啟動模式之前我們應該先

Android Launcher載入流程原始碼分析

Launcher載入流程分析 最近開始接手Launcher模組,為了更好的技術積累,也看到很多大神在CSDN上發的博文,就有了在CSDN寫部落格的想法,這篇博文是我在研究了一段時間Launcher3後寫的,可能有不對的,望大家拍磚。首先我們可以先參考這篇htt

Android usb學習筆記:Android AOA協議Android流程總結

背景 上篇文章中我們瞭解了嵌入式裝置端將Android手機設定為accessory模式的流程以及嵌入式裝置端接收和傳送資料的流程,本文將對應介紹Android端accessory模式被啟用的過程,以及接下來如何與嵌入式裝置端進行通訊。本文的原始碼下載地址:ht

Launcher啟動流程&&載入流程學習

 宣告: 圖片本來是有的 涉及到有些程式碼不能示人沒有貼上,不過僅文字說也足夠了,請廣大老爺們自行下載原始碼參看流程分析閱讀。 目錄 1、功能 1 2、樣式 2 ①許可權: 5 ③總結 25 一、 認識Launcher: 1、功能

Android學習總結——輸入法將BottomNavigationBar(底部導航欄)頂上去的問題

andro devel google tps 底部導航 style log cti googl 在應用清單中給當前<Activity>設置: android:windowSoftInputMode="adjustPan" 關於android:windo

Android學習筆記:超能RecyclerView組件使用總結

popu bin view設置 and col cas mda rac data 個人認為 RecyclerView組件確實值得學習並用到我們的項目中去,前面學了相關的內容。今天再補充一些相關的東東。 1,實現對RecyclerView中的數據進行加入和刪除操作。

Launcher3學習記錄-Launcher第一次啟動時的快捷方式、Widget加載流程

needed tca see task 通過 syn lvs 基本 stp Launcher3的主Activity是Launcher.java,在onCreate()方法中可以找到數據下載的入口。mModel 是類LauncherModel的引用。 1

(轉)Android學習路線總結,絕對幹貨

沖突 另一個 現在 工作流 的確 基礎 啟動過程 checkbox training 一、前言 不知不覺自己已經做了幾年開發了,由記得剛出來工作的時候感覺自己能牛逼,現在回想起來感覺好無知。懂的越多的時候你才會發現懂的越少。 如果你的知識是一個圓,當你的圓越大時,圓外面的世

Android學習---使用非同步內部類實現進度條載入效果

Android學習—使用非同步內部類 為什麼要用AsyncTask? 答:我們可以用上述兩種方法來完成我們的非同步操作,加入要我們寫的非同步操作比較多,或者較為繁瑣, 難道我們new Thread()然後用上述方法通知UI更新麼?程式設計師都是比較喜歡偷懶的,既然官方給我 們

機器學習流程總結概括

在這裡插入圖片描述 如下程式碼是參考部落格:https://blog.csdn.net/han_xiaoyang/article/details/49797143#commentsedit中的例子實現的,具體包括 1、資料檢視 ''' 該部分用於分析各類屬性獲救情況 ''' i

Android原始碼分析Activity載入流程

從Android原始碼分析Activity載入流程 概述:startActivity->startActivityForResult->Instrumentation::execStartActivity->scheduleLaunchActivi