android 设置默认launcher 附上代码
当系统初始化完毕后会进入homeactivity:
具体代码流程:
ActivityManagerService.java -->
public void systemReady(final Runnable goingCallback) {
...
mMainStack.resumeTopActivityLocked(null);
...
}
ActivityStack.java
final boolean resumeTopActivityLocked(ActivityRecord prev) {
return resumeTopActivityLocked(prev, null);
}
final boolean resumeTopActivityLocked(ActivityRecord prev, Bundle options) {
...
return mService.startHomeActivityLocked(mCurrentUser); //开始启动homeactivity了,
...
}
然后我们可以在最开始加入一个自己写的接口,来设置默认launcher:
boolean startHomeActivityLocked(int userId) {
...
setDefaultLauncher();
...
具体代码流程:
ActivityManagerService.java -->
public void systemReady(final Runnable goingCallback) {
...
mMainStack.resumeTopActivityLocked(null);
...
}
ActivityStack.java
final boolean resumeTopActivityLocked(ActivityRecord prev) {
return resumeTopActivityLocked(prev, null);
}
final boolean resumeTopActivityLocked(ActivityRecord prev, Bundle options) {
...
return mService.startHomeActivityLocked(mCurrentUser); //开始启动homeactivity了,
...
}
然后我们可以在最开始加入一个自己写的接口,来设置默认launcher:
boolean startHomeActivityLocked(int userId) {
...
setDefaultLauncher();
...
}
- private void setDefaultLauncher() {
- // get default component
- String packageName = "com.android.launcher";//默认launcher包名
- String className = "com.android.launcher2.Launcher";////默认launcher入口
- Slog.i(TAG, "defautl packageName = " + packageName + ", default className = " + className);
- if ((packageName != null && packageName.trim().length() > 1) && (className != null && className.trim().length() > 0)) {
- boolean firstLaunch = SystemProperties.getBoolean("persist.sys.sw.firstLaunch", true); //只做一次 可以注意这几个变量firstLaunch mFirstLaunch
- 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, "firstLaunch = " + firstLaunch);
- if(mFirstLaunch){
- IPackageManager pm = ActivityThread.getPackageManager();
- //清除当前默认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());
- }
- }
- //获取所有launcher activity
- 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);
- }
- // 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);
- final int N = list.size();
- Slog.d(TAG, "N:::::hyhyhyhy:::: = " + N);
- 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);
- Slog.d(TAG, "r.activityInfo.packageName:::::hyhyhyhy:::: = " + r.activityInfo.packageName);
- Slog.d(TAG, "r.activityInfo.name:::::hyhyhyhy:::: = " + r.activityInfo.name);
- if (r.match > bestMatch) bestMatch = r.match;
- }
- //设置默认launcher
- 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);
- }
- }
- }
- }