デフォルトでは、特定のアプリがスタートアップ ランチャー ナレッジとして使用されます

概要:

Android システムの起動後、ネイティブ ランチャーは Android システムのデスクトップとして使用されず、特定のアプリがシステム デスクトップとして使用されます。

詳細な説明

          ActivityManagerService.java は起動するたびに実行され、設定されたランチャーアプリが毎回デフォルトで起動されます もちろん、設定されたランチャーが存在する場合、setDefaultLauncher() が現在のデフォルトになるため、他のランチャーをデフォルトとして設定することは無効になりますランチャーがクリアされました。デフォルトで起動するように設定されているランチャーをアンインストールした後でのみ、他のランチャーをデフォルトのランチャーとして設定でき、指定したアプリをパッケージ名を通じてデフォルトで起動するランチャーとして設定できます。

コード内の packageName の値は、各 apk のパッケージ名に基づいて決定されます。

コード

diff --git a/android4.4/frameworks/base/services/java/com/android/server/am/ActivityManagerService.java b/android4.4/frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
index 2068333194..3c4a0ec1ab 100755
--- a/android4.4/frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
+++ b/android4.4/frameworks/base/services/java/com/android/server/am/ActivityManagerService.java    
@@ -2955,6 +2955,43 @@ public final class ActivityManagerService extends ActivityManagerNative
         return intent;
     }
  
+      
+       private void setDefaultLauncher() {     
+                       String packageName = null;
+                       packageName = "包名";
+                       ComponentName setHome = null;     
+                       ArrayList<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>();     
+                       ComponentName currentDefaultHome  = mContext.getPackageManager().getHomeActivities(homeActivities);     
+                       if(currentDefaultHome != null)         
+                       {                 
+                               if(currentDefaultHome.getPackageName().equals(packageName))             
+                               {                        
+                                       return;                 
+                               }                 
+                               mContext.getPackageManager().clearPackagePreferredActivities(currentDefaultHome.getPackageName());
               
+                       }         
+                       ComponentName[] mHomeComponentSet = new ComponentName[homeActivities.size()];     
+                       for (int i = 0; i < homeActivities.size(); i++) {                 
+                               final ResolveInfo candidate = homeActivities.get(i);             
+                               final ActivityInfo info = candidate.activityInfo;                 
+                               ComponentName activityName = new ComponentName(info.packageName, info.name);             
+                               mHomeComponentSet[i] = activityName;             
+                               if(info.packageName.equals(packageName)){                         
+                                       setHome = activityName;                 
+                               }         
+                       }         
+                       if(setHome != null){             
+                               IntentFilter mHomeFilter;                 
+                               mHomeFilter = new IntentFilter(Intent.ACTION_MAIN);             
+                               mHomeFilter.addCategory(Intent.CATEGORY_HOME);                 
+                               mHomeFilter.addCategory(Intent.CATEGORY_DEFAULT);                 
+                               mContext.getPackageManager().replacePreferredActivity(mHomeFilter, IntentFilter.MATCH_CATEGORY_EMPTY,             
+                                       mHomeComponentSet, setHome);     
+                       } 
+      
+                }
+      
+
     boolean startHomeActivityLocked(int userId) {
         if (mHeadless) {
             // Added because none of the other calls to ensureBootCompleted seem to fire
@@ -2970,6 +3007,8 @@ public final class ActivityManagerService extends ActivityManagerNative
             // error message and don't try to start anything.
             return false;
         }
+
+               setDefaultLauncher();
         Intent intent = getHomeIntent();
         ActivityInfo aInfo =
             resolveActivityInfo(intent, STOCK_PM_FLAGS, userId);

おすすめ

転載: blog.csdn.net/qq_53676406/article/details/132470825