Android Launcher2源碼分析

來源:互聯網
上載者:User

Android Launcher2源碼分析
Android Launcher2源碼分析Android源碼程式程式中有一個應用程式入口,官方給出的中文翻譯為“啟動器”。我們一下統稱Launcher. Launcher源碼分析,我們還是從AndroidManifest.xml開始:

                                                                            ...

其他,我們姑且也不管,有三點我們必須說一下: 一、
android:hardwareAccelerated="@bool/config_hardwareAccelerated"
指定了整個應用程式是啟用硬體加速的,這樣整個應用程式的運行速度會更快。 二、
android:largeHeap="@bool/config_largeHeap"
指定了應用程式使用了大的堆記憶體,能在一定程度上避免,對記憶體out of memory錯誤的出現。
三、
這個申明,相當於告訴系統這是案頭Activity。如果你希望開發自己的案頭應用。這個申明是必須的 通過這三點的設定,我們大概知道了案頭的核心。 那麼,接下來我們從LauncherApplication(com/android/launcher2/LauncherApplication.java)應用程式開始分析
public void onCreate() {        super.onCreate();        // 在建立icon cache之前,我們需要判斷螢幕的大小和螢幕的像素密度,以便建立合適大小的icon        final int screenSize = getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;        sIsScreenLarge = screenSize == Configuration.SCREENLAYOUT_SIZE_LARGE ||            screenSize == Configuration.SCREENLAYOUT_SIZE_XLARGE;        sScreenDensity = getResources().getDisplayMetrics().density;        mIconCache = new IconCache(this);  //用來設定了應用程式的表徵圖的cache        mModel = new LauncherModel(this, mIconCache);  //LauncherModel主要用於載入案頭的表徵圖、外掛程式和檔案夾,同時LaucherModel是一個廣播接收器,在程式包發生改變、地區、或者設定檔發生改變時,都會發送廣播給LaucherModel,LaucherModel會根據不同的廣播來做相應載入操作        // 註冊廣播接收器        IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);        ......        registerReceiver(mModel, filter);        //註冊ContentObserver,監聽LauncherSettings.Favorites.CONTENT_URI資料的變化        ContentResolver resolver = getContentResolver();        resolver.registerContentObserver(LauncherSettings.Favorites.CONTENT_URI, true,                mFavoritesObserver);    }
查看IconCache(com.android.launcher2.IconCache.java)我們很容易發現,這是一個應用程式圖示(icon)緩衝產生器。
正如我們剛才所說的,我們知道LauncherModel主要用於載入案頭的表徵圖(icon)、外掛程式(AppWidge)和檔案夾(Floder) 和Shortcut。 在LauncherModel(com.android.launcher2.LauncherModel.java)中
public class LauncherModel extends BroadcastReceiver {        public interface Callbacks {          public boolean setLoadOnResume();          public int getCurrentWorkspaceScreen();          public void startBinding();          public void bindItems(ArrayList shortcuts, int start, int end);          public void bindFolders(HashMap folders);          public void finishBindingItems();          public void bindAppWidget(LauncherAppWidgetInfo info);          public void bindAllApplications(ArrayList apps);          public void bindAppsAdded(ArrayList apps);          public void bindAppsUpdated(ArrayList apps);          public void bindAppsRemoved(ArrayList apps, boolean permanent);          public void bindPackagesUpdated();          public boolean isAllAppsVisible();          public void bindSearchablesChanged();      }  }
很明顯

LauncherModel.startLoader(),開始載入的工作。launcherModel中載入好的內容會通過

LauncherModel.Callbacks介面的回呼函數將資料傳給需要的組件


setLoadOnResume() 由於Launcher繼承自Activity,因此Launcher可能會處於paused狀態(onPause()被調用),

則有可能在這段時間內資源可能發生了改變,如應用被刪除或新應用安裝,因此需要在onResume()中調用此方法進行重新載入。

getCurrentWorkspace() 擷取當前螢幕的序號

startBinding() 通知Launcher載入開始,並更新Workspace上的shortcuts

bindItems(ArrayList shortcuts, int start, int end) 載入一批內容項到Workspace,載入的內容項包括,

Application、shortcut、folder。

bindFolders(HashMap folders) 載入folder的內容

finishBindingItems() 通知Launcher載入結束。

bindAppWidget(LauncherAppWidgetInfo item) 載入AppWidget到Workspace

bindAllApplications(final ArrayList apps) 在All Apps頁載入所有應用的Icon

bindAppsAdded(ArrayList apps) 通知Launcher一個新的應用被安裝,並載入這個應用

bindAppsUpdated(ArrayList apps) 通知Launcher一個應用發生了更新

bindAppsRemoved(ArrayList apps, boolean permanent) 通知Launcher一個應用被刪除了

bindPackagesUpdated() 通知Launcher多個應用發生了更新

isAllAppsVisible()用於在載入的過程中記錄當前Launcher的狀態,返回true則當前顯示的All Apps

bindSearchablesChanged()當搜尋/刪除框狀態發生改變時調用

瞭解了每個方法的作用之後,就可以開始進一步的分析了。


瞭解了大概過程,下一步。我們走到Launcher(com.android.launcher2.Launcher.java)
public final class Launcher extends Activityimplements View.OnClickListener,LauncherModel.Callbacks{@Overrideprotected void onCreate(Bundle savedInstanceState) {    ...    mModel = app.setLauncher(this);    mIconCache = app.getIconCache();    ...    mAppWidgetManager = AppWidgetManager.getInstance(this);    mAppWidgetHost = new LauncherAppWidgetHost(this, APPWIDGET_HOST_ID);    mAppWidgetHost.startListening();    ...    //檢查本地儲存的配置是否需要更新    checkForLocaleChange();    setContentView(R.layout.launcher);    //對UI控制項進行初始化和配置    setupViews();    //向使用者展示指導的頁面    showFirstRunWorkspaceCling();    registerContentObservers();    ...    if (!mRestoring) {//為Launcher載入資料        mModel.startLoader(this, true);    }    ...}
別的,我們先不管。 我們先來看看Launcher的啟動
implements  LauncherModel.Callbacks{
mModel = app.setLauncher(this);
我們再來看看LauncherApplication.java中的
LauncherModel setLauncher(Launcher launcher) {      mModel.initialize(launcher);      return mModel;}
從mModel.startLoader(true, mWorkspace.getCurrentPage());我們大概知道載入流程。但那時具體載入過程我們稍後分析 我們先來看一下整個Launcher的布局
launcher.xml                                                                                                              

一、最外層的DragLayer,是一個繼承自FramLayout的View控制項,顯示的就是整個案頭根容器。案頭的所有控制項都是位於DragLayer中。
二、id/dock_divider 它通過include關鍵字包含了另外一個布局檔案workspace_divider.xml ,而這個workspace_divider.xml包含了一ImageView,其實dock_divider就是dock地區上面的那條直線。
三、id/paged_view_indicator 同樣它包含了scroll_indicator.xml,其中包含了一個ImageView,顯示的是一個.9的png檔案。實際上就是當Launcher滾動翻頁的時候,那個淡藍色的頁面指示條。

四、id/workspace 然後案頭的核心容器WorkSpace,如所示,當然你看到的只是Workspace的一部分,其實是一個workspace_screen,通過 Launcher.xml可以看到,整個workspace由5個workspace_screen組成,每個workspace_screen其實就是對應案頭一頁。而每個workspace_screen包含了一個CellLayout,這是一個自訂控制項,繼承自ViewGroup,所以它算是一個用來布局的控制項,在這裡主要用來承載我們每頁的案頭表徵圖、widget和檔案夾。

五 、id/hotseat 其實就是這塊dock地區了
六、id/qsb_bar 就是螢幕最頂端的Google搜尋方塊。這個搜尋方塊是獨立於表徵圖介面的,所以當我們對案頭進行翻頁的時候, 這個搜尋方塊會巍然不動滴固定在最頂端。當然他可不止這麼簡單。他同樣是刪除框,用於應用表徵圖移動到這裡提示
七、id/apps_customize_pane 點擊dock中顯示所有應用程式的按鈕後才會從隱藏狀態轉換為顯示狀態,如所示, 顯示了所有應用程式和所有外掛程式的介面。
八 、id/workspace_cling當第一次運行Launcher2時,會顯示的用於指導的動畫,以後不再顯示
id/folder_cling,第一次使用Folder時,展示給使用者的指導畫面。



看完布局,我們對於Launcher整體用了清醒地認識

首先讓我們回顧一下整個載入過程的流程是怎樣的


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.