做这个需求之前一定要先读一下客户给的launcherAPK的包名和启动类名,避免出现我种情况(客户给的launcherAPK有两个包名是一样的,还不是客户提供给我的那个包名,我一直用客户提供的包名,做了好久也没作用,浪费了好多时间)
diff --git a/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java b/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java
old mode 100644
new mode 100755
index fadc15912dc..db2e3954def
--- a/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java
+++ b/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java
第一种方法:
@@ -307,9 +307,51 @@ public class ResolverActivity extends Activity implements
intent.setFlags(intent.getFlags()&~Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
return intent;
}
+ // swl add
+ private void setupDefaultLauncher(String defPackageName, String defClassName) {
+ if ((defPackageName != null && defPackageName.trim().length() > 1)
+ && (defClassName != null && defClassName.trim().length() > 0)) {
+ IntentFilter filter = new IntentFilter();
+ filter.addAction("android.intent.action.MAIN");
+ filter.addCategory("android.intent.category.HOME");
+ filter.addCategory("android.intent.category.DEFAULT");
+ Intent intent=new Intent(Intent.ACTION_MAIN);
+ intent.addCategory(Intent.CATEGORY_HOME);
+ List list = new ArrayList();
+ list = getPackageManager().queryIntentActivities(intent, 0);
+ final int N = list.size();
+ ComponentName[] set = new ComponentName[N];
+ int bestMatch = 0;
+ for (int i=0; i
+ ResolveInfo r = list.get(i);
+ set[i] = new ComponentName(r.activityInfo.packageName,
+ r.activityInfo.name);
+ if (r.match > bestMatch) bestMatch = r.match;
+ }
+ ComponentName preActivity = new ComponentName(defPackageName, defClassName);
+ getPackageManager().addPreferredActivity(filter, bestMatch, set,preActivity);
+ }
+ }
+ // end
+
@Override
protected void onCreate(Bundle savedInstanceState) {
+ // swl add
+ if(true){
+ String defPackageName = "com.aceage.karie";
+ String defClassName = "com.aceage.karie.activity.launch.LaunchActivity";
+ setupDefaultLauncher(defPackageName, defClassName);
+ Intent intent = new Intent();
+ intent.setClassName(defPackageName, defClassName);
+ intent.setAction("android.intent.action.MAIN");
+ intent.addCategory("android.intent.category.HOME");
+ intent.addCategory("android.intent.category.DEFAULT");
+ startActivity(intent);
+ //Settings.Global.putInt(getApplication().getContentResolver(), Settings.Global.DEFAULT_HOME_SETTING_CHANGED, 1);
+ this.finish();
+ }
+ // end
// Use a specialized prompt when we're handling the 'Home' app startActivity()
final Intent intent = makeMyIntent();
final Set categories = intent.getCategories();
第二个方法:
@@ -381,6 +423,17 @@ public class ResolverActivity extends Activity implements
boolean filterLastUsed = mSupportsAlwaysUseOption && !isVoiceInteraction()
&& !shouldShowTabs();
mMultiProfilePagerAdapter = createMultiProfilePagerAdapter(initialIntents, rList, filterLastUsed);
+ /* // swl add
+ String launcherPackagename = "com.aceage.karie";
+ String launcherActivityname = "com.aceage.karie.activity.launch.LaunchActivity";
+ if(launcherPackagename != null && launcherPackagename.length() > 0 && launcherActivityname != null && launcherActivityname.length() > 0){
+ if(mResolvingHome){
+ setupDefaultLauncher(launcherPackagename,launcherActivityname);
+ finish();
+ return;
+ }
+ }
+ // end */
if (configureContentView()) {
return;
}
@@ -433,6 +486,32 @@ public class ResolverActivity extends Activity implements
intent.getAction() + ":" + intent.getType() + ":"
+ (categories != null ? Arrays.toString(categories.toArray()) : ""));
}
+ /* // swl add
+ private void setupDefaultLauncher(String defPackageName, String defClassName) {
+ if ((defPackageName != null && defPackageName.trim().length() > 1)
+ && (defClassName != null && defClassName.trim().length() > 0)) {
+ IntentFilter filter = new IntentFilter();
+ filter.addAction("android.intent.action.MAIN");
+ filter.addCategory("android.intent.category.HOME");
+ filter.addCategory("android.intent.category.DEFAULT");
+ Intent intent=new Intent(Intent.ACTION_MAIN);
+ intent.addCategory(Intent.CATEGORY_HOME);
+ List list = new ArrayList();
+ list = getPackageManager().queryIntentActivities(intent, 0);
+ final int N = list.size();
+ ComponentName[] set = new ComponentName[N];
+ int bestMatch = 0;
+ for (int i=0; i
+ ResolveInfo r = list.get(i);
+ set[i] = new ComponentName(r.activityInfo.packageName,
+ r.activityInfo.name);
+ if (r.match > bestMatch) bestMatch = r.match;
+ }
+ ComponentName preActivity = new ComponentName(defPackageName, defClassName);
+ getPackageManager().addPreferredActivity(filter, bestMatch, set,preActivity);
+ }
+ }
+ // end */
private boolean isIntentPicker() {
return getClass().equals(ResolverActivity.class);
两个方法的区别就是加入的位置不同,第一个方法开机就运行了,第二个是判断launcher是否有home属性的时候运行的,可以直接用adb命令直接切换launcher3和客户的launcher,命令如下:
关闭客户launcher,切换到系统launcher
1.adb root
2.adb shell pm enable com.android.launcher3
3.adb shell pm disable com.aceage.karie
关闭系统launcher,打开客户launcher
1.adb shell pm enable com.aceage.karie
2.adb shell pm disable com.android.launcher3