launcher3源碼分析
⑴ 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()裡面分析。把主要一些分析用注釋方式寫在代碼裡面,這樣比較方便閱讀。
⑵ Launcher3是什麼意思啊
Launcher3的意思:啟動器3。
Launcher是安卓系統中的桌面啟動器,安卓系統的桌面UI統稱為Launcher。Launcher是安卓系統中的主要程序組件之一,安卓系統中如果沒有Launcher就無法啟動安卓桌面,Launcher出錯的時候,安卓系統會出現「進程 com.android.launcher 意外停止」的提示窗口。這時需要重新啟動Launcher。
(2)launcher3源碼分析擴展閱讀:
Launcher的界面的rootview是DragLayer,它是一個FrameLayout,在它上面workspace(應該說是celllayout)佔了絕大部分的空間,celllayout的參數文件是workspace_screen.xml。
workspace既是一個DropTarget又是一個DragSource,可以從AllAppGridView中拖出應用程序放在它上面,也可以把它裡面的item拖走刪除或者拖到bottombar裡面去。
對於想修改launcher的同學,可以自定義DragLayer.java,比如改為AbsoluteLayout等,再修改launcher.xml布局文件,就可以實現各種樣式的launcher界面。
⑶ 手機上顯示launcher3已停止運行是什麼意思
桌面軟體出錯,用其它手機下載新桌面軟體,用藍牙傳輸,安裝後解決。
⑷ 手機屏幕出現Launcher3是什麼意思
可進行以下操作:
1.重新開關機
2.卸載近期安裝的第三方軟體後觀察
3.備份手機數據(電話簿、簡訊息、多媒體文件等),恢復出廠設置
如果恢復出廠設置問題依然存在,建議將手機送至就近的服務中心進行檢測及進一步處理
⑸ launcher3是什麼
在玩游戲?從官網下載完客戶端 安裝後 是無法直接進入游戲的 你去游戲安裝目錄 運行launcher 會出現 游戲更新信息 更新完成後 在次 進入游戲 你會發現 下面出現一個 收費 電信和網通 這時 仍然是無法進入 然後在去 游戲安裝目錄下 找 version 記事本 打開 把下面內容覆蓋在上面launcher.exe 27.0.3 保存 現在可以進入游戲
⑹ 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中導入應用進行編譯的,此處就不作分析了。回頭有空研究下這些個編譯指令。。。
⑻ 怎麼在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;
}