概要:
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);