1. 程式人生 > >android 當系統存在多個Launcher時,如何設定開機自動進入預設的Launcher?

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_MAINCATEGORY_HOMEintent,而這些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.launcher2Google預設的Launcher2,可以根據自己的需要來定製,讓系統進入指定的那個Launcher