久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

定制你自己的android手機桌面Launcher===一個完成Launcher開發(fā)的介紹

 techres 2011-11-16

launcher也就是我們的Home,,可以簡單地把它理解為一個簡化的linux GUI,。作為一個GUI它首先必須完成它最本分的功能,,
就是它必須能提供對所有應(yīng)用程序(CATEGORY_LAUNCHER)的映射,;不過作為一個 GUI,,它除了做好本分之外還必須是符合大眾審美的美女(wallpaper),;
另外還必須具有良好的交互性,,沒有良好的交互性就像你對一位美女殷勤了半天,她卻直接對無視,,那結(jié)果是比較糟糕的~~
所謂兵馬未動,,糧草先行,在了解launcher的細節(jié)之前,,我們首先需要完成對一些知識的掃盲,。
當然這些知識我們都可以在SDK guide大叔那邊找到,俺可以很負責(zé)任地告訴大家,,如果你把SDK guide大叔的三板斧都學(xué)會了,,
APK你基本就處于無敵狀態(tài)了,絕對護甲+10000,最起碼基礎(chǔ)知識是夠了,,其他比的就是創(chuàng)意了:


1,、必須比較完整地了解APK的4個部件,尤其是Activity,,現(xiàn)在可以簡單地理解Activity是一個應(yīng)用程序的窗口,。


2、必須了解UI的那部分內(nèi)容,,這部分內(nèi)容是比較多的,,English一般的我看得是比較抑郁的,但如果你想設(shè)計一個符合自己審美要求的美女或者帥哥是必須得得了解的,,
不需要一下能完全理解,,但至少出了問題你知道去哪部分查~~


3、Resources那部分內(nèi)容可以當百科全書查


4,、intent那部分內(nèi)容也是需要了解比較詳細的,,他是和應(yīng)用溝通的渠道,大家可以參考一下小斯大蝦寫的文檔,。


5,、manifest必須了解,security可以看看


6,、Graphic部分的內(nèi)容是給需要更高品味的GUI設(shè)計提供的,,雖然它可能主要用在游戲上面,但我覺得如果要作出夠酷的GUI肯定是需要2d,,3d引擎的,。


7、AppWidget可以作為了解,,用的時候再翻閱




各位路過的大蝦們肯定被這么多的糧草給直接雷倒了,,其實需要我們詳細掌握的是1和2,其他的都可以當作百科全書,,但是如果能仔細地看透了那是最好了,。
好,萬事俱備只欠東風(fēng)了,,我們首先來看看這個Home是在啥時候由誰來啟動的,。這部分知識可以跳過,但是理解一下是好的,,
你可以了解一個APK進程是如何懷胎十月之后誕生的,。可能下面說到的詞匯有些生澀,,所以建議先看看Android Anatomy and Physiology.pdf,。
Linux kernel啟動以后會通過App_main進程來初始化android Runtime Java運行環(huán)境,,而zygote是android的第一個進程。
所有的android的應(yīng)用以及大部分系統(tǒng)服務(wù)都是通過zygote fork出來的子進程(我現(xiàn)在看到的只有native的service manager不是由zygote fork出來的),。
在system server中啟動的若干系統(tǒng)服務(wù)中與我們啟動進程相關(guān)的就是Acitivity Manager,。
當systerm server啟動好所有服務(wù)以后,系統(tǒng)就進入”system ready”狀態(tài),,這個時候Activity Manager就登場了,。
Activity Manager光看代碼行就知道是一個重量級的服務(wù),它主要管理Activity之間的跳轉(zhuǎn),,以及進程的生命周期,。
當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進程了,。而這個啟動Home進程的過程實際上還是去通過zygote fork出的一個子進程,。


因此只要在manifest中具備這樣的intent-filter都可以在開機的時候作為Home啟動:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>


多個home之間的switch會在開始的時候有個選擇,至于這個選擇好像是package manager來實現(xiàn)的,,沒有仔細研究過,。




好啦,了解了Lancher是如何執(zhí)行的,,我們再來看看整個lancher內(nèi)部構(gòu)造,。看看一個lancher如何構(gòu)造才算是個長得對得起觀眾的娃:
1,、取得系統(tǒng)中所有安裝好的應(yīng)用程序,,并提供能運行這些程序的映射(形象的理解就是一個一個應(yīng)用程序的小圖標)。這是Lancher的骨架,,
正所謂何謂lancher是吧~~如果它不能提供應(yīng)用程序的訪問,再好看也至多是一個華麗的花瓶而已,,啥用米有,。
2、更好一點我們就需要為這個設(shè)計良好的骨架提供一些畫皮以及一系列動畫效果,,就是我們的wallpaper以及一系列的圖像,,
animation,graphic之類的,。如果完成這部分工作,,基本上我們的Home就基本成型了。
3,、要使得我們的GUI更具親和性更方便使用,,我們還提供一些額外的功能,比如說現(xiàn)在lancher實現(xiàn)的圖標的拖動,,快捷方式等等,。
這些都是仁者見仁智者見智的事情,取決你天馬行空的設(shè)計了。


總結(jié)起來一個lancher包含3個部分內(nèi)容:應(yīng)用程序信息采集,,事件處理,,動畫。下面我們來講述一個自己的launcher的實現(xiàn)過程:
1,、設(shè)計
從純用戶的角度來設(shè)計你的界面,,你希望達到什么樣的效果,盡量寫得詳細,。尤其是應(yīng)用程序信息以如何方式的出現(xiàn),,
以及對它的操作一般都是一個好設(shè)計的亮點。我們現(xiàn)在設(shè)計一個簡單的,,我們需要一個墻紙,,然后在這個墻紙上面有一個條形的控件來顯示我們的應(yīng)用程序圖標。
選擇這些圖標以后會在屏幕中間出現(xiàn)一張圖表示這個應(yīng)用程序的功能,,然后單擊這個圖就會打開這個應(yīng)用程序,。
2、設(shè)計的總體實現(xiàn)
針對自己的設(shè)想來設(shè)計這個lancher的整體實現(xiàn),,如果有無法實現(xiàn)的內(nèi)容就要及時修改設(shè)計,,或者換一種設(shè)計方案。
我們這里使用一個 FrameLayout來作為我們的Lancher的容器,。然后分層,,最下面一層用來放置可能需要的快捷方式以及我們的 wallpaper,
然后在wallpaper層上放一個我們自己定義的component來顯示我們的應(yīng)用程序信息,。個人覺得FrameLayout是比較適合作為lancher的layout的,,
它類似于photoshop的圖層這樣的控制,上面的圖層會覆蓋下面的圖層,。
3,、具體功能的具體實現(xiàn)
這里具體到代碼上就是設(shè)計各種java功能類了。對于wallpaper和圖標的拖拽移動這里簡單提一下,,更多的可以去看Android Lancher的實現(xiàn),。
wallpaper一般是注冊一個broadcastreceiver來處理系統(tǒng)中所有的更改背景圖片的請求,而圖標的脫拽移動則涉及到Draglayer這個類,。
我們來把重點放在如何取得Android已安裝的應(yīng)用程序信息上,。這里就涉及到我們另外一個重要的service了,它就是package manager,,
它負責(zé)對安裝的包進行管理,。這里涉及到一些權(quán)限,我是直接照著android lancher的實現(xiàn)把它的權(quán)限拷貝過來的:
<uses-permission android:name="android.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-permission 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_SETTINGS" />


下面來看看具體的實現(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 <ResolveInfo> apps = manager.queryIntentActivities(mainIntent, 0);
Collections.sort(apps, new ResolveInfo.DisplayNameComparator(manager));


然后我們定義個自己的類MyAppInfo來存儲這些取得的信息:
for (int i = 0; i < count; i++) {
MyAppInfo application = new MyAppInfo();
ResolveInfo info = apps.get(i);
application.title = info.loadLabel(manager);
application.setActivity(new ComponentName(
info.activityInfo.applicationInfo.packageName,
info.activityInfo.name),
Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
application.icon = info.activityInfo.loadIcon(manager);
mApplications.add(application);
}
final void setActivity(ComponentName className, int launchFlags) {
intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setComponent(className);
intent.setFlags(launchFlags);
}


我們使用一個數(shù)組來存儲這些MyAppInfo信息,,并把它提供給Gallery:
private static ArrayList <MyAppInfo> mApplications;
mGallery.setAdapter(new ApplicationsAdapter(this.getContext(), mApplications)) ;


最后重載ArrayAdapter <MyAppInfo>的getView()函數(shù)對畫圖進行一些裁減就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的骨架就搞定了,,不過還有一個,,那就是當我們新安裝或刪除一個應(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)用的編程還是相對簡單的,,只是因為東西很多所以顯得有點復(fù)雜,,但是基本上使用起來還是很方便的,
基本就是繼承之后重載或者實現(xiàn)接口,,而且 Android為Ui的編程提供了一個更方便的方式就是使用XML,,使用xml可以更直觀地來進行你的設(shè)計,
而且也方便了你以后的修改和移植,。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多