一.Android5.1 默认主launcher
1.1.默认launcher属性
diff --git a/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java b/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
index 2566663..82c5497 100755
--- a/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -3259,6 +3259,66 @@ public final class ActivityManagerService extends ActivityManagerNative
}
return intent;
}
+
+ private void setDefaultLauncher() {
+
+
+ String packageName = SystemProperties.get("persist.app.pkgName","com.android.launcher3");
+ String className = SystemProperties.get("persist.app.className","com.android.launcher3.Launcher");
+
+ Slog.i(TAG, "defautl packageName = " + packageName + ", default className = " + className);
+
+
+ if ((packageName != null && packageName.trim().length() > 1) && (className != null && className.trim().length() > 0)) {
+
+ IPackageManager pm = ActivityThread.getPackageManager();
+ ArrayList<IntentFilter> intentList = new ArrayList<IntentFilter>();
+ ArrayList<ComponentName> cnList = new ArrayList<ComponentName>();
+ mContext.getPackageManager().getPreferredActivities(intentList, cnList, null);
+ IntentFilter dhIF;
+ for(int i = 0; i < cnList.size(); i++)
+ {
+ dhIF = intentList.get(i);
+ if(dhIF.hasAction(Intent.ACTION_MAIN) &&
+ dhIF.hasCategory(Intent.CATEGORY_HOME))
+ {
+ mContext.getPackageManager().clearPackagePreferredActivities(cnList.get(i).getPackageName());
+ }
+ }
+ Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.addCategory(Intent.CATEGORY_HOME);
+ List<ResolveInfo> list = new ArrayList<ResolveInfo>();
+ try
+ {
+ list = pm.queryIntentActivities(intent,
+ intent.resolveTypeIfNeeded(mContext.getContentResolver()),
+ PackageManager.MATCH_DEFAULT_ONLY,UserHandle.getCallingUserId());
+ }catch (RemoteException e) {
+ throw new RuntimeException("Package manager has died", e);
+ }
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_MAIN);
+ filter.addCategory(Intent.CATEGORY_HOME);
+ filter.addCategory(Intent.CATEGORY_DEFAULT);
+ final int N = list.size();
+ ComponentName[] set = new ComponentName[N];
+ int bestMatch = 0;
+ for (int i = 0; i < N; i++)
+ {
+ ResolveInfo r = list.get(i);
+ set[i] = new ComponentName(r.activityInfo.packageName,r.activityInfo.name);
+ if (r.match > bestMatch) bestMatch = r.match;
+ }
+ ComponentName launcher = new ComponentName(packageName, className);
+ try
+ {
+ pm.addPreferredActivity(filter, bestMatch, set, launcher,UserHandle.getCallingUserId());
+ } catch (RemoteException e) {
+ throw new RuntimeException("Package manager has died", e);
+ }
+
+ }
+ }
boolean startHomeActivityLocked(int userId, String reason) {
if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL
@@ -3268,6 +3328,9 @@ 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);
diff --git a/packages/apps/Settings/src/com/android/settings/HomeSettings.java b/packages/apps/Settings/src/com/android/settings/HomeSettings.java
old mode 100644
new mode 100755
index 6da1848..8364ee0
--- a/packages/apps/Settings/src/com/android/settings/HomeSettings.java
+++ b/packages/apps/Settings/src/com/android/settings/HomeSettings.java
@@ -55,6 +55,7 @@ import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Index;
import com.android.settings.search.Indexable;
import com.android.settings.search.SearchIndexableRaw;
+import android.os.SystemProperties;
public class HomeSettings extends SettingsPreferenceFragment implements Indexable {
static final String TAG = "HomeSettings";
@@ -124,6 +125,21 @@ public class HomeSettings extends SettingsPreferenceFragment implements Indexabl
mHomeComponentSet, newHome.activityName);
getActivity().setResult(Activity.RESULT_OK);
+
+ //Log.d("xinhua_launcher","className = "+newHome.activityName.getClassName());
+ //Log.d("xinhua_launcher","packageName = " +newHome.activityName.getPackageName());
+
+ SystemProperties.set("persist.app.pkgName",newHome.activityName.getPackageName());
+ SystemProperties.set("persist.app.className",newHome.activityName.getClassName());
+
+ startHomeApk();
+ }
+
+ void startHomeApk(){
+ Intent intent= new Intent(Intent.ACTION_MAIN);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.addCategory(Intent.CATEGORY_HOME);
+ getActivity().startActivity(intent);
}
void uninstallApp(HomeAppPreference pref) {
二.强制主launcher
--- a/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -3268,10 +3268,27 @@ public final class ActivityManagerService extends ActivityManagerNative
// error message and don‘t try to start anything.
return false;
}
- Intent intent = getHomeIntent();
+ String className = SystemProperties.get("persist.app.className","com.android.launcher3.Launcher");
+ Intent intent = getHomeIntent();
ActivityInfo aInfo =
resolveActivityInfo(intent, STOCK_PM_FLAGS, userId);
- if (aInfo != null) {
+ if (aInfo != null) {
+ PackageManager pm = mContext.getPackageManager();
+ Intent newintent = new Intent(Intent.ACTION_MAIN);
+ newintent.addCategory(Intent.CATEGORY_HOME);
+ List<ResolveInfo> resolveInfoList = pm.queryIntentActivities(newintent, 0);
+ if(resolveInfoList != null){
+ int size = resolveInfoList.size();
+ for(int i = 0; i < size; i++){
+ ResolveInfo rInfo = resolveInfoList.get(i);
+ if(rInfo.activityInfo.name.equals(className)){
+ aInfo = rInfo.activityInfo;
+ }
+ }
+ }
+
+ Log.d("gatsby","packageName = "+aInfo.applicationInfo.packageName);
+
intent.setComponent(new ComponentName(
aInfo.applicationInfo.packageName, aInfo.name));
// Don‘t do this if the home app is currently being
Android5.1 默认主launcher、强制主launcher
原文:https://www.cnblogs.com/crushgirl/p/14652878.html