亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android實現定制桌面的方法

2020-04-11 11:24:25
字體:
來源:轉載
供稿:網友

本文實例講述了Android實現定制桌面的方法。分享給大家供大家參考。具體如下:

launcher也就是我們的Home,可以簡單地把它理解為一個簡化的linux GUI。作為一個GUI它首先必須完成它最本分的功能,就是它必須能提供對所有應用程序(CATEGORY_LAUNCHER)的映射;不過作為一個 GUI,它除了做好本分之外還必須是符合大眾審美的美女(wallpaper);另外還必須具有良好的交互性,沒有良好的交互性就像你對一位美女殷勤了半天,她卻直接對無視,那結果是比較糟糕的~~

所謂兵馬未動,糧草先行,在了解launcher的細節之前,我們首先需要完成對一些知識的掃盲。當然這些知識我們都可以在SDK guide大叔那邊找到,俺可以很負責任地告訴大家,如果你把SDK guide大叔的三板斧都學會了,APK你基本就處于無敵狀態了,絕對護甲+10000,最起碼基礎知識是夠了,其他比的就是創意了:

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

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

3、Resources那部分內容可以當百科全書查

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

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

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

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

各位路過的大蝦們肯定被這么多的糧草給直接雷倒了,其實需要我們詳細掌握的是1和2,其他的都可以當作百科全書,但是如果能仔細地看透了那是最好了。

好,萬事俱備只欠東風了,我們首先來看看這個Home是在啥時候由誰來啟動的。這部分知識可以跳過,但是理解一下是好的,你可以了解一個APK進程是如何懷胎十月之后誕生的??赡芟旅嬲f到的詞匯有些生澀,所以建議先看看Android Anatomy and Physiology.pdf。

Linux kernel啟動以后會通過App_main進程來初始化android Runtime Java運行環境,而zygote是android的第一個進程。所有的android的應用以及大部分系統服務都是通過zygote fork出來的子進程(我現在看到的只有native的service manager不是由zygote fork出來的)。在system server中啟動的若干系統服務中與我們啟動進程相關的就是Acitivity Manager。

當systerm server啟動好所有服務以后,系統就進入”system ready”狀態,這個時候Activity Manager就登場了。Activity Manager光看代碼行就知道是一個重量級的服務,它主要管理Activity之間的跳轉,以及進程的生命周期。當Activity Manager發現系統已經啟動好以后它就會發出一個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來實現的,沒有仔細研究過。

好啦,了解了Lancher是如何執行的,我們再來看看整個lancher內部構造??纯匆粋€lancher如何構造才算是個長得對得起觀眾的娃:

1、取得系統中所有安裝好的應用程序,并提供能運行這些程序的映射(形象的理解就是一個一個應用程序的小圖標)。這是Lancher的骨架,正所謂何謂lancher是吧~~如果它不能提供應用程序的訪問,再好看也至多是一個華麗的花瓶而已,啥用米有。

2、更好一點我們就需要為這個設計良好的骨架提供一些畫皮以及一系列動畫效果,就是我們的wallpaper以及一系列的圖像,animation,graphic之類的。如果完成這部分工作,基本上我們的Home就基本成型了。

3、要使得我們的GUI更具親和性更方便使用,我們還提供一些額外的功能,比如說現在lancher實現的圖標的拖動,快捷方式等等。這些都是仁者見仁智者見智的事情,取決你天馬行空的設計了。

總結起來一個lancher包含3個部分內容:應用程序信息采集,事件處理,動畫。下面我們來講述一個自己的launcher的實現過程:

1、設計

從純用戶的角度來設計你的界面,你希望達到什么樣的效果,盡量寫得詳細。尤其是應用程序信息以如何方式的出現,以及對它的操作一般都是一個好設計的亮點。我們現在設計一個簡單的,我們需要一個墻紙,然后在這個墻紙上面有一個條形的控件來顯示我們的應用程序圖標。選擇這些圖標以后會在屏幕中間出現一張圖表示這個應用程序的功能,然后單擊這個圖就會打開這個應用程序。

2、設計的總體實現

針對自己的設想來設計這個lancher的整體實現,如果有無法實現的內容就要及時修改設計,或者換一種設計方案。我們這里使用一個 FrameLayout來作為我們的Lancher的容器。然后分層,最下面一層用來放置可能需要的快捷方式以及我們的 wallpaper,然后在wallpaper層上放一個我們自己定義的component來顯示我們的應用程序信息。個人覺得FrameLayout是比較適合作為lancher的layout的,它類似于photoshop的圖層這樣的控制,上面的圖層會覆蓋下面的圖層。

3、具體功能的具體實現

這里具體到代碼上就是設計各種java功能類了。對于wallpaper和圖標的拖拽移動這里簡單提一下,更多的可以去看Android Lancher的實現。wallpaper一般是注冊一個broadcastreceiver來處理系統中所有的更改背景圖片的請求,而圖標的脫拽移動則涉及到Draglayer這個類。

我們來把重點放在如何取得Android已安裝的應用程序信息上。這里就涉及到我們另外一個重要的service了,它就是package manager,它負責對安裝的包進行管理。這里涉及到一些權限,我是直接照著android lancher的實現把它的權限拷貝過來的:

<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" />

下面來看看具體的實現,我們創建一個自己的控件,使用LinearLayout來裝載ImageSwitcher和Gallery兩個控件,用 Gallery來顯示獲得的應用程序信息,用ImageSwitcher來顯示應用程序的介紹,單擊ImageSwitcher就能打開相應的應用程序。

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)) ;…………}

架構選好了,下面就是如何為這個兩個控件提供已安裝的應用程序的信息,首先我們取得package manager :

復制代碼 代碼如下:
PackageManager manager = this.getContext().getPackageManager();

然后package manager通過intent信息來提供相應的應用程序信息:

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);}

我們使用一個數組來存儲這些MyAppInfo信息,并把它提供給Gallery:

private static ArrayList<MyAppInfo> mApplications;mGallery.setAdapter(new ApplicationsAdapter(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(mAppInfo.intent);}};

這樣基本我們lancher的骨架就搞定了,不過還有一個,那就是當我們新安裝或刪除一個應用程序的時候,我們的Home必須捕獲這個intent,并及時調整home里面的應用程序信息,因此我要為我們的控件注冊一個package的broadcast receiver :

private class ApplicationsIntentReceiver extends BroadcastReceiver {@Overridepublic 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就基本完成了,剩下的就是為各個事件添加你需要的動畫效果,這里就不說了。以前沒有經歷過java編程,但是個人覺得 android java應用的編程還是相對簡單的,只是因為東西很多所以顯得有點復雜,但是基本上使用起來還是很方便的,基本就是繼承之后重載或者實現接口,而且 Android為Ui的編程提供了一個更方便的方式就是使用XML,使用xml可以更直觀地來進行你的設計,而且也方便了你以后的修改和移植

希望本文所述對大家的Android程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情在线狂野欧美精品| 国产日本欧美在线观看| 欧美高清在线观看| 欧美老女人bb| 久久久久久久999精品视频| 91影视免费在线观看| 精品中文字幕乱| 久久久久久国产| 米奇精品一区二区三区在线观看| 国模私拍视频一区| 日韩欧美在线字幕| 国产精品久久久久久av下载红粉| 欧美一级大片在线免费观看| 中文国产成人精品| 91亚洲国产成人久久精品网站| 欧美激情精品久久久久久黑人| 欧美日韩综合视频网址| 久久精品2019中文字幕| 欧美成人四级hd版| 中文字幕精品—区二区| 岛国av一区二区在线在线观看| 久热精品在线视频| 2019中文字幕免费视频| 亚洲精品一区二区三区不| 狠狠干狠狠久久| 中文字幕成人精品久久不卡| 国产精品成人av在线| 国内精品视频一区| 精品久久香蕉国产线看观看亚洲| 欧美电影免费观看高清完整| 日韩毛片在线观看| 日韩精品免费观看| 青草青草久热精品视频在线观看| 2020国产精品视频| 亚洲视屏在线播放| 久久免费福利视频| xxxx性欧美| 久久久久久久久国产精品| 国产在线播放91| 97免费视频在线| 成人信息集中地欧美| 91精品成人久久| 国产精品99久久久久久www| 久久好看免费视频| 91人成网站www| 国产小视频91| 美女视频黄免费的亚洲男人天堂| 久久亚洲精品视频| 欧美肥臀大乳一区二区免费视频| 欧美精品第一页在线播放| 色综合伊人色综合网站| 亚洲国产美女久久久久| 97超级碰碰碰久久久| 亚洲国产精品成人av| 亚洲剧情一区二区| 亚洲精品电影网站| 欧美三级欧美成人高清www| 亚洲最新中文字幕| 日本成人黄色片| 在线观看欧美日韩国产| 久久青草福利网站| 日韩欧美极品在线观看| 欧美一级片免费在线| 国产精品第一第二| 国产成人精品久久二区二区91| 久久久国产精彩视频美女艺术照福利| 日韩久久免费视频| 欧美成人精品一区二区三区| 欧美午夜性色大片在线观看| 欧美一区视频在线| 国产成人精品av在线| 久久久久久12| 中文字幕日韩专区| 国产精品久久久久久婷婷天堂| 久久免费少妇高潮久久精品99| 麻豆乱码国产一区二区三区| 亚洲aⅴ男人的天堂在线观看| 国模叶桐国产精品一区| 97国产一区二区精品久久呦| 精品国产网站地址| 亚洲国产美女精品久久久久∴| 国产精品第三页| 国产成人精品视频在线观看| 2020国产精品视频| 亚洲一级一级97网| 国产在线精品自拍| 91在线免费观看网站| 最近2019年中文视频免费在线观看| 欧美大片欧美激情性色a∨久久| 日韩av日韩在线观看| 国产精品大片wwwwww| 欧美日韩高清区| 日韩高清不卡av| 久久久久久69| 国产性色av一区二区| 亚洲一区二区三区四区在线播放| 久久久久国产精品免费网站| 自拍视频国产精品| 国产成人福利网站| 庆余年2免费日韩剧观看大牛| 亚洲系列中文字幕| 欧美亚洲激情在线| 欧美天天综合色影久久精品| 精品国产91久久久| 热久久99这里有精品| 欧美在线一级va免费观看| 98精品国产高清在线xxxx天堂| 国产99久久精品一区二区永久免费| 91亚洲国产精品| 久久精品电影网站| 亚洲午夜未满十八勿入免费观看全集| 国产精品久久久久福利| 国产91九色视频| 日韩av片永久免费网站| 亚洲欧美日韩在线一区| 精品久久久一区二区| 亚洲一区二区精品| 岛国av午夜精品| 亚洲成人免费网站| 欧洲一区二区视频| 亚洲欧美变态国产另类| 亚洲国产成人91精品| 国产成人鲁鲁免费视频a| 成人福利网站在线观看11| 青青a在线精品免费观看| 乱亲女秽乱长久久久| 欧美日韩在线观看视频小说| 欧美裸体男粗大视频在线观看| 国产91精品青草社区| 97免费中文视频在线观看| 国模精品一区二区三区色天香| 亚洲va久久久噜噜噜久久天堂| 久久国产精品视频| 久久福利网址导航| 欧美日韩亚洲精品内裤| 国产91精品不卡视频| 91国语精品自产拍在线观看性色| 日韩在线视频观看| 成人黄色av播放免费| 欧美日韩一区二区三区在线免费观看| 亚洲国产精品字幕| 中文字幕亚洲色图| 亚洲偷熟乱区亚洲香蕉av| 日韩美女写真福利在线观看| 欧美影院久久久| 国产一区二区美女视频| 欧美亚洲一区在线| 中文.日本.精品| 亚州成人av在线| 7777kkkk成人观看| 91麻豆国产语对白在线观看| 国产精品九九久久久久久久| 久久精品一本久久99精品| 国外日韩电影在线观看| 久久激情视频久久| 亚洲欧洲成视频免费观看| 91久久精品美女高潮| 性欧美长视频免费观看不卡| 亚洲人成亚洲人成在线观看| 国产在线观看一区二区三区| 国产伦精品一区二区三区精品视频| 国产精品成人播放| 久久999免费视频| 久久精品国产一区|