Android8.1/9/10修改系统默认launcher
当系统有多个launcher共存的时候,可以通过此方式设置
修改文件路径:
frameworks\base\services\core\java\com\android\server\am\ActivityManagerService.java
修改此文件是因为每次开机都可以加载此代码,所以对于一些动态需求会有效果。
修改内容:
private void setDefaultLauncher(){
// 只需要修改此处即可
String defaultlauncherpckname = "xxx.xxx.xxx.xxx";
PackageManager mPm = mContext.getPackageManager();
Intent mIntent = new Intent();
mIntent.setAction(Intent.ACTION_MAIN);
mIntent.addCategory(Intent.CATEGORY_HOME);
List<ResolveInfo> mList = mPm.queryIntentActivities(mIntent, 0);
ComponentName[] mHomeComponentSet = new ComponentName[mList.size()];
ComponentName newHome = null;
for (int i = 0; i < mList.size(); i++) {
ActivityInfo info = mList.get(i).activityInfo;
ComponentName componentName = new ComponentName(info.packageName, info.name);
mHomeComponentSet[i] = componentName;
if (info.packageName.equals(defaultlauncherpckname)) {
newHome = componentName;
}
}
if (newHome != null) {
IntentFilter mHomeFilter = new IntentFilter();
mHomeFilter.addAction(Intent.ACTION_MAIN);
mHomeFilter.addCategory(Intent.CATEGORY_HOME);
mHomeFilter.addCategory(Intent.CATEGORY_DEFAULT);
// Android8.1以后弃用了源码中的方法,如果依旧用会报错(笔者没办法调用老式)
mPm.replacePreferredActivity(mHomeFilter, IntentFilter.MATCH_CATEGORY_EMPTY, mHomeComponentSet, newHome);
}
}
然后在 startHomeActivityLocked()
方法中调用即可
boolean startHomeActivityLocked(int userId, String reason) {
if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL
&& mTopAction == null) {
// We are running in factory test mode, but unable to find
// the factory test app, so just sit around displaying the
// error message and don't try to start anything.
return false;
}
// add start
setDefaultLauncher();
// add end
Intent intent = getHomeIntent();
ActivityInfo aInfo = resolveActivityInfo(intent, STOCK_PM_FLAGS, userId);
.....
}
好了,至此就完成了,如果还需要系统当前默认launcher,可以通过以下方法:
Intent intent = new Intent();
intent.setAction("android.intent.action.MAIN");
intent.addCategory("android.intent.category.DEFAULT");
intent.addCategory("android.intent.category.HOME");
final ResolveInfo res = getContext().getPackageManager().resolveActivity(intent, 0);
// if (res.activityInfo.packageName.equals("android")) {
// 此packageName是当前launcher的包名,
// 如果当前还没有默认launcher,则默认launcher的包名为 android
android.util.Log.d("defaulthome","showlauncher1 = " + res.activityInfo.packageName);