launcher3源碼
『壹』 Launcher3是什麼意思啊
Launcher3的意思:啟動器3。
Launcher是安卓系統中的桌面啟動器,安卓系統的桌面UI統稱為Launcher。Launcher是安卓系統中的主要程序組件之一,安卓系統中如果沒有Launcher就無法啟動安卓桌面,Launcher出錯的時候,安卓系統會出現「進程 com.android.launcher 意外停止」的提示窗口。這時需要重新啟動Launcher。
(1)launcher3源碼擴展閱讀:
Launcher的界面的rootview是DragLayer,它是一個FrameLayout,在它上面workspace(應該說是celllayout)佔了絕大部分的空間,celllayout的參數文件是workspace_screen.xml。
workspace既是一個DropTarget又是一個DragSource,可以從AllAppGridView中拖出應用程序放在它上面,也可以把它裡面的item拖走刪除或者拖到bottombar裡面去。
對於想修改launcher的同學,可以自定義DragLayer.java,比如改為AbsoluteLayout等,再修改launcher.xml布局文件,就可以實現各種樣式的launcher界面。
『貳』 怎麼在Android Launcher3源碼的主菜單界面中加入menu功能
在Launcher.java:
private static final int MENU_GROUP_WALLPAPER = 1;
/// M: menu group for settings and apps item, add for OP09.
private static final int MENU_GROUP_SETTINGS = 2;
private static final int MENU_GROUP_APPS = 3;
private static final int MENU_WALLPAPER_SETTINGS = Menu.FIRST + 1;
private static final int MENU_MANAGE_APPS = MENU_WALLPAPER_SETTINGS + 1;
private static final int MENU_SYSTEM_SETTINGS = MENU_MANAGE_APPS + 1;
private static final int MENU_HELP = MENU_SYSTEM_SETTINGS + 1;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (isWorkspaceLocked()) {
return false;
}
super.onCreateOptionsMenu(menu);
Intent manageApps = new Intent(Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS);
manageApps.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
Intent settings = new Intent(android.provider.Settings.ACTION_SETTINGS);
settings.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
String helpUrl = getString(R.string.help_url);
Intent help = new Intent(Intent.ACTION_VIEW, Uri.parse(helpUrl));
help.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
menu.add(MENU_GROUP_WALLPAPER, MENU_WALLPAPER_SETTINGS, 0, R.string.menu_wallpaper)
.setIcon(android.R.drawable.ic_menu_gallery)
.setAlphabeticShortcut('W');
menu.add(MENU_GROUP_APPS, MENU_MANAGE_APPS, 0, R.string.menu_manage_apps)
.setIcon(android.R.drawable.ic_menu_manage)
.setIntent(manageApps)
.setAlphabeticShortcut('M');
menu.add(MENU_GROUP_SETTINGS, MENU_SYSTEM_SETTINGS, 0, R.string.menu_settings)
.setIcon(android.R.drawable.ic_menu_preferences)
.setIntent(settings)
.setAlphabeticShortcut('P');
if (!helpUrl.isEmpty()) {
menu.add(0, MENU_HELP, 0, R.string.menu_help)
.setIcon(android.R.drawable.ic_menu_help)
.setIntent(help)
.setAlphabeticShortcut('H');
}
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
/// M: show options menu when in workspace state
if (mState == State.WORKSPACE && !mWorkspace.isInOverviewMode()) {
mWorkspace.enterOverviewMode();
}else if (mState==State.APPS_CUSTOMIZE){
return true;
}
return false;
}
『叄』 Android Launcher 如何去掉主菜單,所有應用擺在桌面,類似小米桌面
那個桌面就是那樣的改不了,你可以下載一個桌面替代他,比如GO桌面,小米桌面我沒試過能否下載,你也可以搜索下。應該也是可以的。系統設置裡面可以設置默認使用哪個桌面。
。。。。。。暈原來你是搞開發的呀,你可以把所有圖標都放到workspace上,把應用列表屏蔽了,workspace的數據來源於LauncherModler類,裡面會讀一個資料庫得到一個列表,然後再數據綁定把這個列表啪啪啪顯示到workspace上,你可以去修改那個讀資料庫的方法,想辦法把所有應用都加到那個列表上去。
『肆』 android源碼中有launcher2launcher3,用的是哪個
1、Launcher進程啟動過程
可以由下面圖看到Launcher進程是如何被創建啟動:
Activity Manager通過發送Intend來啟動Launcher。
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);
}
startActivityLocked(null, intent, null, null, 0, aInfo,
null, null, 0, 0, 0, false, false);
復制代碼
因此,如果你要開機啟動一個替換Launcher的程序,只要在程序<intent-filter>裡面加入action.MAIN 、
category.HOME、category.DEFAULT就可以。如果出現多個程序都加入這種intent,系統會彈出讓你選擇
哪個作為啟動器。
2、Launcher初始化——LauncherApplication。
Application類,我想大部分做Android應用的朋友都用過,每個Android應用默認都有一個Application類,
你也可以繼承Application類,然後加入自己代碼。Application是一個全局的應用類,在AndroidManifest.xml
我們也可以找到Application標簽。
<application
android:name="com.android.launcher2.LauncherApplication"
android:label="@string/application_name"
android:icon="@drawable/ic_launcher_home"
android:hardwareAccelerated="@bool/config_hardwareAccelerated"
android:largeHeap="@bool/config_largeHeap"
android:configChanges="locale">
</application>
復制代碼
Android四大組件的聲明都需要放到application標簽裡面,默認使用的是系統的Application類,如果你在項目裡面重載了它。就需要在標簽,name屬性下寫上你的新的Application類名。Launcher裡面就是繼承了Application為LauncherApplication。應用啟動的時候首先會載入Application。我們可以看到Launcher主類Launcher.java的onCreate函數裡面,第一個就是獲取Application的實例。
LauncherApplication app = ((LauncherApplication)getApplication());
復制代碼
接下來我們看看LauncherApplication裡面初始化,LauncherApplication大部分工作就是在初始化完成,剩下都是一些返回介面。
@Override
public void onCreate()
{
super.onCreate();
//獲取屏幕大小,主要用來區分手機還是平板
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;
//IconCahe裡面保存了界面所有應用圖標的繪畫需要的數據,這個到時候具體分析再說。
//加入這東西的主要原因是為了提高繪畫界面的效率
mIconCache = new IconCache(this);
//資料庫載入類,LauncherModel是Launcher裡面非常重要的一個類,相當於MVC模式裡面的
//Model功能,管理數據和初始化數據
mModel = new LauncherModel(this, mIconCache);
//下面注冊了一些監聽器,主要包含APK文件更新刪除等數據變化的時候接收的通知
//接收通知後,主要是用來更新Launcher裡面的資料庫。因為桌面應用圖標數據,只會載入一次
IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
filter.addDataScheme("package");
registerReceiver(mModel, filter);
filter = new IntentFilter();
filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);
filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);
filter.addAction(Intent.ACTION_LOCALE_CHANGED);
filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
registerReceiver(mModel, filter);
filter = new IntentFilter();
filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED);
registerReceiver(mModel, filter);
filter = new IntentFilter();
filter.addAction(SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED);
registerReceiver(mModel, filter);
//contentresolver則是用於管理所有程序的contentprovider實例
ContentResolver resolver = getContentResolver();
//注冊內容觀察者,監聽application資料庫變化,回調
resolver.registerContentObserver(LauncherSettings.Favorites.CONTENT_URI, true, mFavoritesObserver);
}
復制代碼
上面是LauncherApplication最主要的工作,初始化整個Launcher的一些關鍵類,和注冊一些監聽器。主要都是用來監聽應用的安裝更新刪除等導致Launcher資料庫變化的操作。Launcher數據都是使用contentprovider來提供數據。其中注冊的監聽介面是
private final ContentObserver mFavoritesObserver = new ContentObserver(new Handler())
{
@Override
public void onChange(boolean selfChange)
{
//重新載入界面數據
mModel.startLoader(LauncherApplication.this, false);
}
};
復制代碼
LauncherSettings.Favorites.CONTENT_URI裡面數據發生變化的時候,都會調用mModel.startLoader()介面,
重新載入Launcher的數據。startLoader的具體操作,我後面分析LauncherModel類的時候會分析。這一塊涉及
Launcher所有數據載入。剩下的接都是返回初始化時候創建的對象或者獲取屏幕密度、獲取是否大屏幕。
後面很多處理都需要判斷是否是大屏幕,4.0以後手機平板都共用一套系統,導致多了很多處理。 3、Launcher.java初始化Launcher.java是Launcher裡面最主要的類,是一個Activity。啟動的第一個組件。既然是Activity,我們要分析它初始化,毫無疑問,需要找到onCreate()裡面分析。把主要一些分析用注釋方式寫在代碼裡面,這樣比較方便閱讀。
『伍』 有沒有人分享一下修改launcher的歷程
我自己總結的,ubuntu和windows下幾種不同的修改Launcher的方法:
總共有三大類:
#################
第一類,改簽名:
#################
前面幾個步驟ubuntu和windows通用:
=====================================================================================================
1 eclipse中新建android project,選擇create project from existing source,去android源碼目錄下的packages/apps下找到相應的文件夾。(直接修改的是源碼,所以需要先打包備份一下)然後選擇build target之後finish,可能會等待一段時間。
2 導入完成後,src全是錯誤,由於在Android源碼中,很多方法、成員、類、包都被打上@hide標簽,這些成員在SDK中沒有公開,以至於在編譯Launcher源碼時最常遇到的類android.view.View的成員mScrollX無法訪問。
。以Launcher2為例,我們用到的有:(生成的包的路徑為out/target/common/obj/JAVA_LIBRARIES)
1)framework_intermediates/classes.jar :這個主要是android的框架類
2)android-common_intermediates/classes.jar :這個包含com.android.common.Search這個類
3)core_intermediates/classes.jar :這個包包含dalvik.system.VMRuntime這個類
右鍵工程名稱然後選擇Build Path->Configure Build Path...->Libraries->Add Library->User Library->User Libraries...->New...
然後將上面3個依賴的包一個個的加入進來,分別命名為android_framework,android_common,android_core.
將3個包加入進來後,然後還需要將它們放到android2.3.3這個包的前面,可以在Build Path配置中選擇Order and Export
這時候就會發現Launcher2工程以及沒有錯誤了,也可以編譯了。(其他的模塊可能需要別的jar包,都在out/target/common/obj/JAVA_LIBRARIES下能找到).
=====================================================================================================
然後:
===================================================================================================
windows環境下:工程現在是不能直接運行的,因為eclipse默認的debug簽名跟模擬器中的系統簽名不相符合。因此,因此,需要手動簽名。
3 用eclipse導出沒有簽名的版本,右鍵工程,android tools->export unsigned application package,得到未簽名的apk包。
4 在build\target\proct\security下都是一些公鑰和密鑰,system版本的公鑰和密鑰是platform.pk8和platform.x509.pem兩個文件,shared版本的公鑰和密鑰是shared.pk8和shared.x509.pem兩個文件。模塊應用是什麼版本的可以查看AndroidManifest.xml文件,android:sharedUserId="android.uid.system" 表示是system版android:sharedUserId="android.uid.shared"是shared版。除了公鑰密鑰之外,還需要簽名的包即signapk.jar,它在out/host/linux-x86/framework下。
5 將這些工具准備好後,就能打出簽名包了。比如我的為簽名apk是Launcher.apk並且是shared版本。因此java -jar signapk.jar share.x509.pem shared.pk8 Launcher.apk Launcher-signed.apk(system版本就用platform.pk8和platform.x509.pem相應的替換一下)
6 得到了簽名包之後,adb install -r Lancher-signed.apk就行了,直接替換掉原來的Launcher。
=====================================================================================================
ubuntu環境下:利用android源碼提供的工具自動簽名
3 編譯源碼
4 gedit .bashrc 最後面添加
export PATH=$PATH:/home/xxx/android/out/host/linux-x86/bin
export ANDROID_PRODUCT_OUT=/home/xxx/android/out/target/proct/generic
其中的/home/xxx/android是源碼目錄
5 然後啟動模擬器,命令為emulator
6 在eclipse中修改好源碼模塊比如Launcher2之後,將工程放到android源碼目錄下的packages/apps下,刪除掉自動生成的一些文件,比如bin,assets,gen等等。跟其他模塊文件保持一致。
7 android源碼目錄下執行 . build/envsetup.sh 這個時候多出mm,mmm等命令,進入修改過後的那個模塊目錄下,比如packages/apps/Launcher2/下,執行mm,會自動生成已經簽名過的apk文件,放在out/target/proct/generic/system/app下。
8直接adb install -r out/target/proct/generic/system/app/Launcher2.apk即可。
=====================================================================================================
注意:以上的簽名跟源碼相關,如果源碼只是generic的也就是模擬器版,那麼編譯出來的也只能在模擬器上跑,若要在真機上跑,則需要真機的簽名庫,可惜沒有- -,所以需要:
##################
第二類,改包名。
##################
照常理說,應該很簡單,直接在src下的包上F2,然後修改。但是我的機器這個eclipse很奇怪,總有各種問題,現在總結下:
1.導入工程,備份一下AndroidManifest.xml,原因下面有。F2修改包名,修改的時候下面四個選項都選上。
2.修改AndroidManifest.xml
將備份的AndroidManifest.xml換回來,然後ctrl+f,替換全部的原來包名為你現在的,比如之前是com.android.launcher2,現在換成com.pqrs.launcherEx。然後將android:sharedUserId="XXX"這句話刪掉。(這么做的原因是,在第一步中可能已經自動的替換了一些這個xml文件的東西,但是我這eclipse亂七八糟的,缺字或者其他什麼的,此時文件已經損壞了。所以第一步之前,需要備份一下AndroidManifest.xml,在這個步驟中替換回來,然後ctrl+f進行替換。)
3.保存後會有提示,說這個文件變化了,是否作出其他變更,點擊yes。然後res下可能會有一些錯誤,打開那些xml文件,一般都是有些資源引用還是之前的com.android.launcher2,相應的都該成com.pqrs.launcherEx.
比如<favorites xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher2">改為<favorites xmlns:launcher="http://schemas.android.com/apk/res/com.pqrs.launcherEx">
4.由於AndroidManifest.xml中的包名改了,gen目錄下的自動生成文件也會跟著變化,但是src下的java文件引用的R文件路徑還沒便過來,還需要更正過來。方法:包名上ctrl+h,選擇file search,在Containing text下輸入之前的import語句,比如是import com.android.launcher2.R;在File name patterns:中填入*.java(表示搜索java文件)scope下選擇Selected resources,然後點擊Replace進行全局替換。
5.如果都順利的話,現在這就是一個新的工程了,直接在eclipse中修改運行即可,而且不限操作系統。
====================================================================================================
#############################################
第三類,網上流傳的,最傳統的方法,只限於ubuntu下。
##############################################
1、建立基本的Android開發環境
請參考官方文檔或<<Android模擬器在Ubuntu8.10的安裝>>
2、編譯Android源碼
Android源碼根目錄下通過make進行編譯,請注意一些配置,具體可參考<<android源碼的編譯>>
3、把eclipse工程配置文件復制到Android源碼根目錄下
cp development/ide/eclipse/.classpath ./
chmod u+w .classpath # Make the writable
4、修改eclipse程序的配置
1)、增大eclipse內存設置
把eclipse.ini(在eclipse軟體的安裝目錄下)的3個值改為下面的值:
-Xms128m
-Xmx512m
-XX:MaxPermSize=256m
2)、把Android-formatting.xml和android.importorder導入eclipse(可選)
Android-formatting.xml、.classpath和android.importorder都放在development/ide/eclipse/下
Android-formatting.xml用來配置eclipse編輯器的代碼風格;android.importorder用來配置eclipse的import的順序和結構。
在window->preferences->java->Code style->Formatter中導入Android-formatting.xml
在window->preferences->java->Code style->Organize Imports中導入Android.importorder
3)、安裝anyedit插件(可選)
在http://andrei.gmxhome.de/anyedit/下載並導入eclipse中
5、把Android源碼作為一個工程導入eclipse
導入前先檢查.classpath里的文件在Android源碼中是否有相應的文件(文件夾),否則也會破壞android源碼(一般是多添加文件/文件夾),.classpath里多餘的路徑可刪除
新建Java Project(不是Android project,否則會破壞android源碼),www.linuxidc.com選擇從已存在的工程導入,工程名任意,完成。
導入時,eclipse要build工程,比較慢。導完後,一般都沒有錯誤。
這里也就回答了第4個問題
6、eclipse上調試Android里的程序。
為了不讓其它版本的Android工具和android文件系統影響下面的編譯和調試,需要從環境變數中去除android工具和android文件系統的路徑:
vim ~/.bashrc
看看有沒有在PATH變數中加入Android工具和android文件系統的路徑,如果加有,則注釋它。通過下面的方法,我們是不需要在.bashrc中添加android工具和android文件系統的路徑的
執行:
cd Android源碼目錄
. build/envsetup.sh #設了環境變數之後,會多出mmm等命令,可以通過輸入help來查看
lunch 1 # 把emulator等工具和ramdisk.img等文件的路徑對應起來,就可以直接調用emulator等工具,也解決了第3個問題
emulator &
ddms &
注意,先啟動ddms,再啟動eclipse,這樣eclipse中就不會說埠沖突
然後在eclipse中配置調試類型和埠:
在Run->Debug Configurations->Remote java application上雙擊,然後,」Host:」設為localhost,」Port:」設為8800,」Connection Type」為Standard(Socket Attach)
然後「Apply」
注意,上面設置的埠要與DDMS中設置的埠一致,ADT插件使用了8700埠,因此上面設置的埠是8800。如果出現連不到VM的錯誤時,請注意,要先在DDMS中選中某一進程(對應某一應用程序),才能在eclipse執行 Debug。
在eclipse調試時,可以設斷點、單步調試。估計google團隊也是這樣開發、調試Android應用程序的
7、編譯Android源碼
執行:
cd Android源碼目錄
. build/envsetup.sh
那 么就會多出mm/mmm等命令,mm/mmm用來編譯模塊(包括C、C++、JAVA程序)。我們也可以直接在 Android源碼根目錄下執行「make 模塊名」來編譯模塊(模塊名可以在.mk文件中找到)。模塊編譯後會在out/target/proct/generic/system/app下生 成對應的.apk包。但是,用mm/mmm來編譯生成的.apk並不會打包到system.img中,需要我們手動通過make snod把 system文件夾打包為system.img,不過這就得重新運行模擬器了,這也是很麻煩了。對於我們開發者來說,我們可以這樣做:
1)把需要修改、調試的模塊(比如AlarmClock.apk)從/system/app下移除,然後make snod,這樣system.img就沒有AlarmClock.apk了。
2)運行模擬器,就看不到AlarmClock了
3)修改AlarmClock源碼並用mm/mmm來編譯,在/system/app下生成AlarmClock.apk
4)通過adb把AlarmClock.apk安裝到Android文件系統中,安裝方法有兩個:
A、通過adb install xxx/AlarmClock.apk
B、通過adb push xxx/AlarmClock.apk /data/app
兩 種方法都可以把 AlarmClock安裝到/data/app下,Android會自動把它顯示在主菜單中(只要AlarmClock.apk中有一Activity包 含android.intent.category.LAUNCHER屬性),不過A方法在/data/app生成 com.android.alarmclock.apk,B方法則是 AlarmClock.apk。用A方法時,如果原來已經安裝了 AlarmClock,你還得先adb uninstall 它,而B方法則不用。推薦使用B方法。同樣,卸載可以通過adb uninstall或adb shell rm xxx/xxx.apk來,也推薦用刪除的方法來卸載
『陸』 如何在Eclipse中調試Launcher源碼
要在eclipse中運行launcher代碼首先要有launcher源碼以及相關的運行庫文件,
下載完了之後將其解壓,裡面有兩個文件夾,一個是Launcher源碼,另一個是Launcher的運行庫,
將Launcher源碼導入eclipse
下面開始導庫,我們剛剛下載來那個文件有個叫做「classes庫」的文件夾,裡面裝的就是庫了,注意哪些文件夾的名字,等一下要用的哦。
在eclipse中右鍵項目名選擇Properties,這時會出現這個東西
點擊Java Build Path
從下面的這步開始就是添加每個庫的操作了,等一下需要將以下的步驟重復:
這里填的名字就寫下載來的庫對應文件夾的名稱,比如:android-common_intermediates
找到android-common_intermediates文件夾裡面的classes.jar文件
這時已經成功添加完了一個庫
重復以上步驟,將所有的庫都添加完,
然後點擊OK
點擊Finish
點擊Order and Export
把剛才添加的3個都選中,再點擊Top
點擊OK
這時項目已經不再報錯
如果你項目還報錯的話,請Clean一下你的項目,Clean項目應該懂吧,點擊eclipse的Project選擇Clean,再把你要Clean的項目勾選上點擊OK。
如果我們此時運行項目的話,很多情況下都是安裝不了的,因為你的項目現在的包名是「com.android.launcher2」,而你設備上launcher的包名也很有可能是這個包名,由於包名一樣而簽名不同,所以會安裝失敗。那麼我們就要把現在項目的包名改一下。
下面介紹一種改包名的方法,可以將整個項目中用到包名的地方都改到,而且還是一種比較快的方式(我以把「com.android.launcher2」改成「com.android.li.launcher2」為例):
滑鼠右鍵包名--->Refactor--->Raname
把這個地方改了
改成「com.android.li.launcher2」
這里的包名已經改好了,不過還要將整個項目中用到包名的地方都替換成現在的包名。
點擊「Search」--->「File」
勾選上「Enclosing projects」,點擊「Replace」
看看項目還有沒有報錯,如果項目還有報錯的話,Clean一下項目就可以的了(怎樣Clean項目前面已經說過了),如果你Clean了之後還有報錯的話,那很有可能就是你在操作上有問題了,仔細找找看哪裡弄錯了吧。
這是沒有做過修改的launcher4.2,看看它在4.2模擬器上的運行效果吧:
到此為止launcher4.2已經完美的跑起來了,和自己說聲辛苦啦,呵呵!
『柒』 Android的Launcher3源碼中,FocusIndicatorView有什麼作用
1、Launcher進程啟動過程可以由下面圖看到Launcher進程是如何被創建啟動:ActivityManager通過發送Intend來啟動Launcher。Intentintent=newIntent(mTopAction,mTopData!=null?Uri.parse(mTopData):null);intent.setComponent(mTopComponent);if(mFactoryTest!=SystemServer.FACTORY_TEST_LOW_LEVEL){intent.addCategory(Intent.CATEGORY_HOME);}startActivityLocked(null,intent,null,null,0,aInfo,null,null,0,0,0,false,false);復制代碼因此,如果你要開機啟動一個替換Launcher的程序,只要在程序裡面加入action.MAIN、category.HOME、category.DEFAULT就可以。如果出現多個程序都加入這種intent,系統會彈出讓你選擇哪個作為啟動器。2、Launcher初始化——LauncherApplication。Application類,我想大部分做Android應用的朋友都用過,每個Android應用默認都有一個Application類,你也可以繼承Application類,然後加入自己代碼。Application是一個全局的應用類,在AndroidManifest.xml我們也可以找到Application標簽。復制代碼Android四大組件的聲明都需要放到application標簽裡面,默認使用的是系統的Application類,如果你在項目裡面重載了它。就需要在標簽,name屬性下寫上你的新的Application類名。Launcher裡面就是繼承了Application為LauncherApplication。應用啟動的時候首先會載入Application。我們可以看到Launcher主類Launcher.java的onCreate函數裡面,第一個就是獲取Application的實例。LauncherApplicationapp=((LauncherApplication)getApplication());復制代碼接下來我們看看LauncherApplication裡面初始化,LauncherApplication大部分工作就是在初始化完成,剩下都是一些返回介面。@OverridepublicvoidonCreate(){super.onCreate();//獲取屏幕大小,主要用來區分手機還是平板finalintscreenSize=getResources().getConfiguration().screenLayout&Configuration.SCREENLAYOUT_SIZE_MASK;sIsScreenLarge=screenSize==Configuration.SCREENLAYOUT_SIZE_LARGE||screenSize==Configuration.SCREENLAYOUT_SIZE_XLARGE;//屏幕密度sScreenDensity=getResources().getDisplayMetrics().density;//IconCahe裡面保存了界面所有應用圖標的繪畫需要的數據,這個到時候具體分析再說。//加入這東西的主要原因是為了提高繪畫界面的效率mIconCache=newIconCache(this);//資料庫載入類,LauncherModel是Launcher裡面非常重要的一個類,相當於MVC模式裡面的//Model功能,管理數據和初始化數據mModel=newLauncherModel(this,mIconCache);//下面注冊了一些監聽器,主要包含APK文件更新刪除等數據變化的時候接收的通知//接收通知後,主要是用來更新Launcher裡面的資料庫。因為桌面應用圖標數據,只會載入一次IntentFilterfilter=newIntentFilter(Intent.ACTION_PACKAGE_ADDED);filter.addAction(Intent.ACTION_PACKAGE_REMOVED);filter.addAction(Intent.ACTION_PACKAGE_CHANGED);filter.addDataScheme("package");registerReceiver(mModel,filter);filter=newIntentFilter();filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);filter.addAction(Intent.ACTION_LOCALE_CHANGED);filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);registerReceiver(mModel,filter);filter=newIntentFilter();filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED);registerReceiver(mModel,filter);filter=newIntentFilter();filter.addAction(SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED);registerReceiver(mModel,filter);//contentresolver則是用於管理所有程序的contentprovider實例ContentResolverresolver=getContentResolver();//注冊內容觀察者,監聽application資料庫變化,回調resolver.registerContentObserver(LauncherSettings.Favorites.CONTENT_URI,true,mFavoritesObserver);}復制代碼上面是LauncherApplication最主要的工作,初始化整個Launcher的一些關鍵類,和注冊一些監聽器。主要都是用來監聽應用的安裝更新刪除等導致Launcher資料庫變化的操作。Launcher數據都是使用contentprovider來提供數據。其中注冊的監聽介面是=newContentObserver(newHandler()){@OverridepublicvoidonChange(booleanselfChange){//重新載入界面數據mModel.startLoader(LauncherApplication.this,false);}};復制代碼LauncherSettings.Favorites.CONTENT_URI裡面數據發生變化的時候,都會調用mModel.startLoader()介面,重新載入Launcher的數據。startLoader的具體操作,我後面分析LauncherModel類的時候會分析。這一塊涉及Launcher所有數據載入。剩下的接都是返回初始化時候創建的對象或者獲取屏幕密度、獲取是否大屏幕。後面很多處理都需要判斷是否是大屏幕,4.0以後手機平板都共用一套系統,導致多了很多處理。3、Launcher.java初始化Launcher.java是Launcher裡面最主要的類,是一個Activity。啟動的第一個組件。既然是Activity,我們要分析它初始化,毫無疑問,需要找到onCreate()裡面分析。把主要一些分析用注釋方式寫在代碼裡面,這樣比較方便閱讀。
『捌』 android 7.0 launcher3 編譯報錯:
編譯過程中報錯提示如下:
make: *** No rule to make target `out/target/common/obj/JAVA_LIBRARIES/libprotobuf-Java-2.3.0-nano_intermediates/javalib.jar', needed by `out/target/common/obj/APPS/Launcher3_intermediates/classes-full-debug.jar'. Stop.
原生的SDK居然報錯,沒辦法只能著手分析了。從字面分析來看是編譯需要的protobuf jar包沒有build進去導致的,先看看是哪個相關的包。
host-libprotobuf-java-2.3.0-nano.jar這個jar包沒編譯出來,看了下源碼的mk文件,是有相關的編譯配置的,於是想想是不是有編譯依賴包相關的指令,
網上一找,還真有mma,於是mma一敲,嘩啦啦的過了。
網上有很多介紹的文章是在eclips中導入應用進行編譯的,此處就不作分析了。回頭有空研究下這些個編譯指令。。。
『玖』 launcher3已停止運行是什麼意思怎麼修復
launcher3是android系統中谷歌做 的桌面,其他廠商改源碼改出問題來了。
1、官網下載固件刷機。
2、找客服。