进入哪一个Launcher,如果不想选择,而是想直接进入某一个默认的Launcher,并且
用户在设置->应用程序->管理应用程序->所有应用程序列表,找到之前设置的那个默
认的Launcher,并且取消了默认值,可以重新弹出launcher选框。
设置默认的Launcher
找到平台相关下的.mk文件,即进程初始化的文件
搜索到如下属性,即指定的默认的launcher
ro.sw.defaultlauncherpackage=packagename \
ro.sw.defaultlauncherclass=packageClass \
下面看看该代码的逻辑部分:
在源码中,找到android\frameworks\base\services\java\com\android\server\am该目录下的 ActivityManagerService.java。
在startHomeActivityLocked方法中,会看到 setDefaultLauncher(userId); 顾名思义是设置默认的launcher,
如果没有,则在startHomeActivityLocked方式开头处添加setsetDefaultLauncher函数。
下面看看此函数的面目:
private void setDefaultLauncher(int userId)
{
// get default component
String packageName = SystemProperties.get("ro.sw.defaultlauncherpackage", "no");
String className = SystemProperties.get("ro.sw.defaultlauncherclass", "no");
Slog.i(TAG, "default packageName = " + packageName + ", default className = " + className);
if(!packageName.equals("no") && !className.equals("no")){
boolean firstLaunch = SystemProperties.getBoolean("persist.sys.sw.firstLaunch", true);
Slog.d(TAG, "firstLaunch = " + firstLaunch);
if(firstLaunch){
mFirstLaunch = true;
// do this only for the first boot
//SystemProperties.set("persist.sys.sw.firstLaunch", "false");
}
Slog.d(TAG, "mFirstLaunch = " + mFirstLaunch);
if(mFirstLaunch){
IPackageManager pm = ActivityThread.getPackageManager();
//clear the current preferred launcher
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());
}
}
// get all Launcher activities
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, userId);
}catch (RemoteException e) {
throw new RuntimeException("Package manager has died", e);
}
// get all components and the best match
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_MAIN);
filter.addCategory(Intent.CATEGORY_HOME);
filter.addCategory(Intent.CATEGORY_DEFAULT);
int N = list.size();
<span style="color:#FF6666;"> for(int j=(N-1);j>=0;j--){
final ResolveInfo r = list.get(j);
if(!r.activityInfo.packageName.equals(packageName)){
list.remove(j);
N -= 1;
}
} </span>
ComponentName[] set = new ComponentName[N];
int bestMatch = 0;
<span style="color:#FF6666;">for (int i = 0; i < N; i++)
{
ResolveInfo r = list.get(i);
set[i] = new ComponentName(r.activityInfo.packageName,
r.activityInfo.name);
if(className.equals(r.activityInfo.name)){
bestMatch = r.match;
}
}</span>
// add the default launcher as the preferred launcher
ComponentName launcher = new ComponentName(packageName, className);
try
{
pm.clearPackagePreferredActivities(launcher.getPackageName());
pm.addPreferredActivity(filter, bestMatch, set, launcher, userId);
} catch (RemoteException e) {
throw new RuntimeException("Package manager has died", e);
}
}
}
}
增加并修改了红色部分代码, 其目的就是匹配.mk文件中指定的launcher, 若不remove掉其他安装的launcher,则系统会弹出
对话框,供用户选择,这样的话, 我们每次按home键,都会弹出对话框
以上步骤可以达到目的。
若还是无法达到目的,请使用以下方法:
请再修改 packageManagerService.java
(framework/base/services/java/com/android/server/pm/)
找到findPreferredActivity 方法
在末尾处增加如下部分代码:
if (!pa.mPref.sameSet(query, priority)) {
if(!(intent.getAction() != null
&& intent.getAction().equals(intent.ACTION_MAIN)
&& intent.getCategories()!=null
&& intent.getCategories().contains(intent.CATEGORY_HOME))){
Slog.i(TAG, "Result set changed, dropping preferred activity"
+ intent + " type " + resolvedType);
//pir = mSettings.mPreferredActivities.removeFilter(pa); 前面部分有对其初始化,可忽略
pir.removeFilter(pa);
return null;
}
Slog.i(TAG,"Result set not change, not drop preferred activity special intent: "+intent);
/*
Slog.i(TAG, "Result set changed, dropping preferred activity for "
+ intent + " type " + resolvedType);
pir.removeFilter(pa);
return null;
*/
}
至此,问题应该是可以解决了。