



下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、定制你自己的桌面 - launcher小覷launcher 也就是我們的 Home ,可以簡單地把它理解為一個簡化的 linux GUI 。作為一個 GUI 它首先 必須完成它最本分的功能, 就是它必須能提供對所有應用程序 (CATEGORY_LAUNCHER) 的映射; 不過作 為一個 GUI ,它除了做好本分之外還必須是符合大眾審美的美女 (wallpaper) ;另外還必須具有良好的交 互性,沒有良好的交互性就像你對一位美女殷勤了半天,她卻直接對無視,那結果是比較糟糕的所謂兵馬未動,糧草先行,在了解 launcher 的細節之前,我們首先需要完成對一些知識的掃盲。當然 這些知識我們都可以
2、在 SDK guide 大叔那邊找到,俺可以很負責任地告訴大家,如果你把 SDK guide 大 叔的三板斧都學會了, APK 你基本就處于無敵狀態了,絕對護甲 10000 ,最起碼基礎知識是夠了,其他 比的就是創意了:1、必須比較完整地了解 APK 的 4 個部件,尤其是 Activity ,現在可以簡單地理解 Activity 是一個 應用程序的窗口。2、必須了解 UI 的那部分內容,這部分內容是比較多的, English 一般的我看得是比較抑郁的,但如果你想設計一個符合自己審美要求的美女或者帥哥是必須得得了解的,不需要一下能完全理解,但至少 出了問題你知道去哪部分查3 、Resource
3、s 那部分內容可以當百科全書查4、intent 那部分內容也是需要了解比較詳細的,他是和應用溝通的渠道,大家可以參考一下小斯大 蝦寫的文檔。5 、 manifest 必須了解, security 可以看看6、Graphic 部分的內容是給需要更高品味的 GUI 設計提供的,雖然它可能主要用在游戲上面,但 我覺得如果要作出夠酷的 GUI 肯定是需要 2d , 3d 引擎的。7 、AppWidget 可以作為了解,用的時候再翻閱 各位路過的大蝦們肯定被這么多的糧草給直接雷倒了, 其實需要我們詳細掌握的是 1 和 2,其他的都 可以當作百科全書,但是如果能仔細地看透了那是最好了。好,萬事俱備只欠東風
4、了,我們首先來看看這個 Home 是在啥時候由誰來啟動的。這部分知識可以跳 過,但是理解一下是好的,你可以了解一個 APK 進程是如何懷胎十月之后誕生的。可能下面說到的詞匯有 些生澀,所以建議先看看 Android Anatomy and Physiology.pdf 。Linux kernel 啟動以后會通過 App_main 進程來初始化 android Runtime Java 運行環境,而 zygote 是 android 的第一個進程。所有的 android 的應用以及大部分系統服務都是通過 zygote fork 出 來的子進程 ( 我現在看到的只有 native 的 servic
5、e manager 不是由 zygote fork 出來的 ) 。在 system server 中啟動的若干系統服務中與我們啟動進程相關的就是 Acitivity Manager 。當 systerm server 啟動好所有服務以后,系統就進入 ” system ready ”狀態,這個時候 Activity Manager 就登場了。 Activity Manager 光看代碼行就知道是一個重量級的服務,它主要管理 Activity 之 間的跳轉, 以及進程的生命周期。 當 Activity Manager 發現系統已經啟動好以后它就會發出一個 intent : Intent inten
6、t = new Intent(mTopAction,mTopData != null ? Uri.parse(mTopData) : null);intent.setComponent(mTopComponent);if (mFactoryTest != SystemServer .FACTORY_TEST_LOW_LEVEL) intent.addCategory(Intent.CATEGORY_HOME);通過這個 category 類型為 home 的 intent , Activity Manager 就會通過:startActivityLocked(null, intent, nul
7、l, null, 0, aInfo,null, null, 0, 0, 0, false, false);啟動 Home 進程了。而這個啟動 Home 進程的過程實際上還是去通過 zygote fork 出的一個子進程。因 此只要在 manifest 中具備這樣的 intent filter 都可以在開機的時候作為 Home 啟動:<intent-filter><action android:name="ent.action.MAIN" /><category android:name="e
8、nt.category.HOME"/><category android:name="ent.category.DEFAULT" /></intent-filter>多個 home 之間的 switch 會在開始的時候有個選擇, 至于這個選擇好像是 package manager 來實現的, 沒有仔細研究過。好啦,了解了 Lancher 是如何執行的,我們再來看看整個 lancher 內部構造。看看一個 lancher 如何 構造才算是個長得對得起觀眾的娃:1 、取得系統中所有安裝好的應用程序,并提供能運行這些程
9、序的映射 ( 形象的理解就是一個一個應用程 序的小圖標)。這是Lancher的骨架,正所謂何謂lancher是吧如果它不能提供應用程序的訪問,再好看也至多是一個華麗的花瓶而已,啥用米有。2 、更好一點我們就需要為這個設計良好的骨架提供一些畫皮以及一系列動畫效果,就是我們的wallpaper 以及一系列的圖像, animation , graphic 之類的。 如果完成這部分工作, 基本上我們的 Home 就基本成型了。3 、要使得我們的 GUI 更具親和性更方便使用,我們還提供一些額外的功能,比如說現在lancher 實現的圖標的拖動,快捷方式等等。這些都是仁者見仁智者見智的事情,取決你天馬行
10、空的設計了。總結起來一個 lancher 包含 3 個部分內容:應用程序信息采集,事件處理,動畫。下面我們來講述一個 自己的 launcher 的實現過程:1 、設計從純用戶的角度來設計你的界面,你希望達到什么樣的效果,盡量寫得詳細。尤其是應用程序信息以如 何方式的出現,以及對它的操作一般都是一個好設計的亮點。我們現在設計一個簡單的,我們需要一個墻 紙,然后在這個墻紙上面有一個條形的控件來顯示我們的應用程序圖標。選擇這些圖標以后會在屏幕中間 出現一張圖表示這個應用程序的功能,然后單擊這個圖就會打開這個應用程序。2 、設計的總體實現針對自己的設想來設計這個 lancher 的整體實現,如果有無法
11、實現的內容就要及時修改設計,或者換一 種設計方案。我們這里使用一個 FrameLayout 來作為我們的 Lancher 的容器。然后分層,最下面一層 用來放置可能需要的快捷方式以及我們的 wallpaper ,然后在 wallpaper 層上放一個我們自己定義的 component 來顯示我們的應用程序信息。個人覺得 FrameLayout 是比較適合作為 lancher 的 layout 的,它類似于 photoshop 的圖層這樣的控制,上面的圖層會覆蓋下面的圖層。3 、具體功能的具體實現這里具體到代碼上就是設計各種 java 功能類了。對于 wallpaper 和圖標的拖拽移動這里簡單
12、提一下, 更多的可以去看 Android Lancher 的實現。 wallpaper 一般是注冊一個 broadcastreceiver 來處理系統 中所有的更改背景圖片的請求,而圖標的脫拽移動則涉及到 Draglayer 這個類。我們來把重點放在如何取得 Android 已安裝的應用程序信息上。這里就涉及到我們另外一個重要的 service 了,它就是 package manager ,它負責對安裝的包進行管理。這里涉及到一些權限,我是直接 照著 android lancher 的實現把它的權限拷貝過來的:<uses-permission android:name="and
13、roid.permission.CALL_PHONE" /><uses-permission android:name="android.permission.EXPAND_STATUS_BAR" /><uses-permission android:name="android.permission.GET_TASKS" /><uses-permission android:name="android.permission.READ_CONTACTS"/><uses-permi
14、ssion android:name="android.permission.SET_WALLPAPER" /><uses-permission android:name="android.permission.SET_WALLPAPER_HINTS" /><uses-permission android:name="android.permission.VIBRATE" /><uses-permission android:name="android.permission.WRITE_S
15、ETTINGS" /> 下面來看看具體的實現,我們創建一個自己的控件,使用 LinearLayout 來裝載 ImageSwitcher 和 Gallery 兩個控件,用 Gallery 來顯示獲得的應用程序信息, 用 ImageSwitcher 來顯示應用程序的介紹, 單擊 ImageSwitcher 就能打開相應的應用程序。public class MyLancherSwitcher extends LinearLayout implements ViewSwitcher .ViewFactory,AdapterView.OnltemSelectedListener,Ada
16、pterView.OnltemClickListenermImageSwitcher = new ImageSwitcher(context) ; mGallery = new Gallery(context) ;this.addView(mlmageSwitcher,newLinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,400) ;this.addView(mGallery, new LinearLayout.LayoutParams(LayoutParams.FlLL_PARENT 80) ;架構選好了,下面就是如何為這個兩個控件提供
17、已安裝的應用程序的信息,首先我們取得packagemanager :PackageManager manager = this.getContext().getPackageManager();然后 package manager 通過 intent 信息來提供相應的應用程序信息: lntent mainlntent = new lntent(lntent.ACTlON_MAlN, null);mainlntent.addCategory(lntent.CATEGORY_LAUNCHER);final List <Resolvelnfo> apps = manager.queryl
18、ntentActivities(mainlntent, 0);Collections.sort(apps, new Resolvelnfo.DisplayNameComparator(manager);然后我們定義個自己的類 MyApplnfo 來存儲這些取得的信息: for (int i = 0; i < count; i+) MyApplnfo application = new MyApplnfo();Resolvelnfo info = apps.get(i);application.title = info.loadLabel(manager);application.setA
19、ctivity(new ComponentName( info.activitylnfo.applicationlnfo.packageName, ), lntent.FLAG_ACTlVlTY_NEW_TASK| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);application.icon = info.activityInfo.loadIcon(manager);mApplications.add(application);final void setActivity(ComponentName clas
20、sName, int launchFlags) intent = new Intent(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_LAUNCHER);intent.setComponent(className);intent.setFlags(launchFlags);我們使用一個數組來存儲這些 MyAppInfo 信息,并把它提供給 Gallery :private static ArrayList <MyAppInfo> mApplications;mGallery.setAdapter(new Applica
21、tionsAdapter(this.getContext(), mApplications) ;最后重載 ArrayAdapter <MyAppInfo> 的 getView() 函數對畫圖進行一些裁減就 OK 了, Gallery 就 能顯示我們的應用程序的圖片信息了。最后我們把 Gallery 中被選中的圖片的應用程序信息傳給 ImageSwitcher ,并為 ImageSwithcher 注冊一個按鍵事件,就可以啟動應用程序了:private OnClickListener mImageSwitcherListener = new OnClickListener()public void onClick(View v)if(mAppInfo = null)elsev.getContext().startActivity(mAppIent); ;這樣基本我們 lancher 的骨架就搞定了,不過還有一個,那就是當我們新安裝或刪除一個應用程序的 時候,我們的 Home 必須捕獲這個 intent ,并及時調整 home 里面的應
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司毛衣直播策劃方案
- 公司行政服務活動方案
- 公司組織跑步小活動方案
- 公司校招策劃方案
- 公司春節后開業活動方案
- 公司新春慰問福利活動方案
- 公司瑜伽學習活動方案
- 公司組織制作香熏活動方案
- 公司氛圍策劃方案
- 公司聚會桌面活動方案
- 湘教版七年級下冊地理期末試卷-附答案
- 教科版五年級下冊科學知識點整理
- 小學六年級數學計算題100道(含答案)
- DB33T 2250-2020企業綜合能耗確權核算通則
- 年產24萬噸硫酸轉化系統工藝設計
- 楊元喜-組合導航與融合導航(簡本)
- GB/T 7721-2007連續累計自動衡器(電子皮帶秤)
- 護理查房(宮外孕)課件
- 公司扣款單據模板
- 會議服務中心經營管理服務方案
- 糖尿病病人的業務學習課件
評論
0/150
提交評論