android 當系統存在多個Launcher時,如何設定開機自動進入預設的Launcher?
來自MTK FAQ
當系統存在多個Launcher時,開機完成並解鎖後,系統會彈出一個選擇框讓使用者選擇進入哪一個Launcher,如果不想選擇,而是想直接進入某一個預設的Launcher,並且使用者在設定->應用程式->管理應用程式->所有應用程式列表,找到之前設定的那個預設的Launcher,並且取消了預設值,可以重新彈出launcher選框。
下面以設定Google Launcher2作為預設啟動的Launcher為例,其包名為com.android.launcher2
packages/apps/Provision/src/com/android/DefaultActivity.java
......
// remove this activity from the package manager.
PackageManager pm = getPackageManager();
//add start
Intent intent=new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
List<ResolveInfo> resolveInfoList = pm.queryIntentActivities(intent, 0);
if(resolveInfoList != null){
int size = resolveInfoList.size();
for(int j=0;j<size;j++){
final ResolveInfo r = resolveInfoList.get(j);
if(r.activityInfo.packageName.equals(this.getPackageName())){ //attention
resolveInfoList.remove(j);
size -= 1;
j--;
}
}
ComponentName[] set = new ComponentName[size];
ComponentName defaultLauncher=new ComponentName("com.android.launcher2", "com.android.launcher2.Launcher");
int defaultMatch=0;
for(int i=0;i<size;i++){
final ResolveInfo resolveInfo = resolveInfoList.get(i);
Log.d(TAG, resolveInfo.toString());
set[i] = new ComponentName(resolveInfo.activityInfo.packageName,resolveInfo.activityInfo.name);
if(defaultLauncher.getClassName().equals(resolveInfo.activityInfo.name)){
defaultMatch = resolveInfo.match;
}
}
Log.d(TAG,"defaultMatch="+Integer.toHexString(defaultMatch));
IntentFilter filter=new IntentFilter();
filter.addAction(Intent.ACTION_MAIN);
filter.addCategory(Intent.CATEGORY_HOME);
filter.addCategory(Intent.CATEGORY_DEFAULT);
pm.clearPackagePreferredActivities(defaultLauncher.getPackageName());
pm.addPreferredActivity(filter, defaultMatch, set, defaultLauncher);
}
//add end
// remove this activity from the package manager.
ComponentName name = new ComponentName(this, DefaultActivity.class);
pm.setComponentEnabledSetting(name,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
......
然後修改packages/apps/Provision/AndroidManifest.xml檔案,增加以下語句:
<uses-permission android:name=”android.permission.SET_PREFERRED_APPLICATIONS” />
說明:上面新增的程式碼中,需要注意如下這個if判斷條件寫法不是唯一的,如果按照FAQ的寫法,設定預設Launcher不成功,則要根據系統當前apk的情況來做修改;
if(r.activityInfo.packageName.equals(this.getPackageName())){
不成功的原因是:系統有其他的apk也會接收Intent.ACTION_MAIN,CATEGORY_HOME的intent,而這些apk又不是Launcher程式(啟動器程式);
這種情況下就需要在這個if判斷中將這些apk的相應Activity剔除掉;
例如:Settings中有一個activity:CryptKeeper,它也會接收HOME intent,那麼if判斷就需要改為如下所示:
if(r.activityInfo.packageName.equals(this.getPackageName()) || r.activityInfo.name.equals("com.android.settings.CryptKeeper") ){
如果按照FAQ的寫法,發現設定預設Launcher不成功,如何判斷需要剔除哪些activity呢?
方法如下:在download完第一次開機時,用adb logcat -v time >main.log抓取main log,搜尋DefaultActivity這個tag,因為在上面新增程式碼中,
Log.d(TAG, resolveInfo.toString()); 這條語句會打印出resolveInfoList中每條記錄的值,如果發現其中某一條記錄不是Launcher程式,那麼就在上面的if判斷中,新增相應判斷條件即可。
備註:上面所新增的全部程式碼,一定要放在pm.setComponentEnabledSetting這兩行語句之前,如果放在這個語句後面,那所新增的程式碼就無法執行了,導致設定失效。這裡的com.android.launcher2是Google預設的Launcher2,可以根據自己的需要來定製,讓系統進入指定的那個Launcher。