亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1217 | 回復(fù): 0
打印 上一主題 下一主題

定制你自己的桌面--- launcher小覷 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-11-24 09:45 |只看該作者 |倒序?yàn)g覽
   launcher也就是我們的Home,可以簡單地把它理解為一個簡化的linux GUI。作為一個GUI它首先必須完成它最本分的功能,就是它必須能提供對所有應(yīng)用程序(CATEGORY_LAUNCHER)的映射;不過作為一個 GUI,它除了做好本分之外還必須是符合大眾審美的美女(wallpaper);另外還必須具有良好的交互性,沒有良好的交互性就像你對一位美女殷勤了半天,她卻直接對無視,那結(jié)果是比較糟糕的~~
  所謂兵馬未動,糧草先行,在了解launcher的細(xì)節(jié)之前,我們首先需要完成對一些知識的掃盲。當(dāng)然這些知識我們都可以在SDK guide大叔那邊找到,俺可以很負(fù)責(zé)任地告訴大家,如果你把SDK guide大叔的三板斧都學(xué)會了,APK你基本就處于無敵狀態(tài)了,絕對護(hù)甲+10000,最起碼基礎(chǔ)知識是夠了,其他比的就是創(chuàng)意了:
      1、必須比較完整地了解APK的4個部件,尤其是Activity,現(xiàn)在可以簡單地理解Activity是一個應(yīng)用程序的窗口。
      2、必須了解UI的那部分內(nèi)容,這部分內(nèi)容是比較多的,English一般的我看得是比較抑郁的,但如果你想設(shè)計(jì)一個符合自己審美要求的美女或者帥哥是必須得得了解的,不需要一下能完全理解,但至少出了問題你知道去哪部分查~~
      3、Resources那部分內(nèi)容可以當(dāng)百科全書查
      4、intent那部分內(nèi)容也是需要了解比較詳細(xì)的,他是和應(yīng)用溝通的渠道,大家可以參考一下小斯大蝦寫的文檔。
      5、manifest必須了解,security可以看看
      6、Graphic部分的內(nèi)容是給需要更高品味的GUI設(shè)計(jì)提供的,雖然它可能主要用在游戲上面,但我覺得如果要作出夠酷的GUI肯定是需要2d,3d引擎的。
      7、AppWidget可以作為了解,用的時候再翻閱
      各位路過的大蝦們肯定被這么多的糧草給直接雷倒了,其實(shí)需要我們詳細(xì)掌握的是1和2,其他的都可以當(dāng)作百科全書,但是如果能仔細(xì)地看透了那是最好了。
    好,萬事俱備只欠東風(fēng)了,我們首先來看看這個Home是在啥時候由誰來啟動的。這部分知識可以跳過,但是理解一下是好的,你可以了解一個APK進(jìn)程是如何懷胎十月之后誕生的。可能下面說到的詞匯有些生澀,所以建議先看看Android Anatomy and Physiology.pdf。
      Linux kernel啟動以后會通過App_main進(jìn)程來初始化android Runtime Java運(yùn)行環(huán)境,而zygote是android的第一個進(jìn)程。所有的android的應(yīng)用以及大部分系統(tǒng)服務(wù)都是通過zygote fork出來的子進(jìn)程(我現(xiàn)在看到的只有native的service manager不是由zygote fork出來的)。在system server中啟動的若干系統(tǒng)服務(wù)中與我們啟動進(jìn)程相關(guān)的就是Acitivity Manager。
      當(dāng)systerm server啟動好所有服務(wù)以后,系統(tǒng)就進(jìn)入”system ready”狀態(tài),這個時候Activity Manager就登場了。Activity Manager光看代碼行就知道是一個重量級的服務(wù),它主要管理Activity之間的跳轉(zhuǎn),以及進(jìn)程的生命周期。當(dāng)Activity Manager發(fā)現(xiàn)系統(tǒng)已經(jīng)啟動好以后它就會發(fā)出一個intent:
    Intent intent = 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, null, null, 0, aInfo,
                            null, null, 0, 0, 0, false, false);
啟動Home進(jìn)程了。而這個啟動Home進(jìn)程的過程實(shí)際上還是去通過zygote fork出的一個子進(jìn)程。因此只要在manifest中具備這樣的intent-filter都可以在開機(jī)的時候作為Home啟動:
            
                 
                 
                 
            
多個home之間的switch會在開始的時候有個選擇,至于這個選擇好像是package manager來實(shí)現(xiàn)的,沒有仔細(xì)研究過。
  好啦,了解了Lancher是如何執(zhí)行的,我們再來看看整個lancher內(nèi)部構(gòu)造。看看一個lancher如何構(gòu)造才算是個長得對得起觀眾的娃:
  1、取得系統(tǒng)中所有安裝好的應(yīng)用程序,并提供能運(yùn)行這些程序的映射(形象的理解就是一個一個應(yīng)用程序的小圖標(biāo))。這是Lancher的骨架,正所謂何謂lancher是吧~~如果它不能提供應(yīng)用程序的訪問,再好看也至多是一個華麗的花瓶而已,啥用米有。
  2、更好一點(diǎn)我們就需要為這個設(shè)計(jì)良好的骨架提供一些畫皮以及一系列動畫效果,就是我們的wallpaper以及一系列的圖像,animation,graphic之類的。如果完成這部分工作,基本上我們的Home就基本成型了。
  3、要使得我們的GUI更具親和性更方便使用,我們還提供一些額外的功能,比如說現(xiàn)在lancher實(shí)現(xiàn)的圖標(biāo)的拖動,快捷方式等等。這些都是仁者見仁智者見智的事情,取決你天馬行空的設(shè)計(jì)了。
  總結(jié)起來一個lancher包含3個部分內(nèi)容:應(yīng)用程序信息采集,事件處理,動畫。下面我們來講述一個自己的launcher的實(shí)現(xiàn)過程:
  1、設(shè)計(jì)
  從純用戶的角度來設(shè)計(jì)你的界面,你希望達(dá)到什么樣的效果,盡量寫得詳細(xì)。尤其是應(yīng)用程序信息以如何方式的出現(xiàn),以及對它的操作一般都是一個好設(shè)計(jì)的亮點(diǎn)。我們現(xiàn)在設(shè)計(jì)一個簡單的,我們需要一個墻紙,然后在這個墻紙上面有一個條形的控件來顯示我們的應(yīng)用程序圖標(biāo)。選擇這些圖標(biāo)以后會在屏幕中間出現(xiàn)一張圖表示這個應(yīng)用程序的功能,然后單擊這個圖就會打開這個應(yīng)用程序。
  2、設(shè)計(jì)的總體實(shí)現(xiàn)
  針對自己的設(shè)想來設(shè)計(jì)這個lancher的整體實(shí)現(xiàn),如果有無法實(shí)現(xiàn)的內(nèi)容就要及時修改設(shè)計(jì),或者換一種設(shè)計(jì)方案。我們這里使用一個 FrameLayout來作為我們的Lancher的容器。然后分層,最下面一層用來放置可能需要的快捷方式以及我們的 wallpaper,然后在wallpaper層上放一個我們自己定義的component來顯示我們的應(yīng)用程序信息。個人覺得FrameLayout是比較適合作為lancher的layout的,它類似于photoshop的圖層這樣的控制,上面的圖層會覆蓋下面的圖層。
  3、具體功能的具體實(shí)現(xiàn)
  這里具體到代碼上就是設(shè)計(jì)各種java功能類了。對于wallpaper和圖標(biāo)的拖拽移動這里簡單提一下,更多的可以去看Android Lancher的實(shí)現(xiàn)。wallpaper一般是注冊一個broadcastreceiver來處理系統(tǒng)中所有的更改背景圖片的請求,而圖標(biāo)的脫拽移動則涉及到Draglayer這個類。
  我們來把重點(diǎn)放在如何取得Android已安裝的應(yīng)用程序信息上。這里就涉及到我們另外一個重要的service了,它就是package manager,它負(fù)責(zé)對安裝的包進(jìn)行管理。這里涉及到一些權(quán)限,我是直接照著android lancher的實(shí)現(xiàn)把它的權(quán)限拷貝過來的:
     
     
     
     
     
     
     
     
  下面來看看具體的實(shí)現(xiàn),我們創(chuàng)建一個自己的控件,使用LinearLayout來裝載ImageSwitcher和Gallery兩個控件,用 Gallery來顯示獲得的應(yīng)用程序信息,用ImageSwitcher來顯示應(yīng)用程序的介紹,單擊ImageSwitcher就能打開相應(yīng)的應(yīng)用程序。
  public class MyLancherSwitcher extends LinearLayout implements ViewSwitcher.ViewFactory, AdapterView.OnItemSelectedListener,AdapterView.OnItemClickListener{
…………
        mImageSwitcher = new ImageSwitcher(context) ;
        mGallery = new Gallery(context) ;
      
        this.addView(mImageSwitcher, new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,400)) ;
        this.addView(mGallery, new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, 80)) ;
…………

  架構(gòu)選好了,下面就是如何為這個兩個控件提供已安裝的應(yīng)用程序的信息,首先我們?nèi)〉胮ackage manager :
  PackageManager manager = this.getContext().getPackageManager();
  然后package manager通過intent信息來提供相應(yīng)的應(yīng)用程序信息:
  Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
  mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
  
  final List  apps = manager.queryIntentActivities(mainIntent, 0);
  Collections.sort(apps, new ResolveInfo.DisplayNameComparator(manager));
  然后我們定義個自己的類MyAppInfo來存儲這些取得的信息:
    for (int i = 0; i  mApplications;
    mGallery.setAdapter(new ApplicationsAdapter(this.getContext(), mApplications)) ;
  
  最后重載ArrayAdapter 的getView()函數(shù)對畫圖進(jìn)行一些裁減就OK了,Gallery就能顯示我們的應(yīng)用程序的圖片信息了。最后我們把Gallery中被選中的圖片的應(yīng)用程序信息傳給ImageSwitcher,并為ImageSwithcher注冊一個按鍵事件,就可以啟動應(yīng)用程序了:
    private OnClickListener mImageSwitcherListener = new OnClickListener(){
        public void onClick(View v){
            if(mAppInfo == null){}
            else
            v.getContext().startActivity(mAppInfo.intent);
        }
    } ;
  
    這樣基本我們lancher的骨架就搞定了,不過還有一個,那就是當(dāng)我們新安裝或刪除一個應(yīng)用程序的時候,我們的Home必須捕獲這個intent,并及時調(diào)整home里面的應(yīng)用程序信息,因此我要為我們的控件注冊一個package的broadcast receiver :
    private class ApplicationsIntentReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            loadApplications(false);
        }
    }
  
    private void registerIntentReceivers() {
        filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
        filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
        filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
        filter.addDataScheme("package");
        registerReceiver(mApplicationsReceiver, filter);
    }
  
  Ok這樣我們的lancher就基本完成了,剩下的就是為各個事件添加你需要的動畫效果,這里就不說了。以前沒有經(jīng)歷過java編程,但是個人覺得 android java應(yīng)用的編程還是相對簡單的,只是因?yàn)闁|西很多所以顯得有點(diǎn)復(fù)雜,但是基本上使用起來還是很方便的,基本就是繼承之后重載或者實(shí)現(xiàn)接口,而且 Android為Ui的編程提供了一個更方便的方式就是使用XML,使用xml可以更直觀地來進(jìn)行你的設(shè)計(jì),而且也方便了你以后的修改和移植。

本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u2/85805/showart_2101714.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP