android 启动时自动设置default Launcher
16lz
2021-01-25
设置default Launcher
系统有多个Launcher时,会在packages.xml 设置如下信息:
/data/system/packages.xml
-
如何在启动时自动设置default Launcher呢?
方法一:
在PackageManagerService构造函数中,会读取packages.xml文件:mRestoredSettings = mSettings.readLPw();
所以在之前添加设置:
readPermissions();
String firstBoot = SystemProperties.get("persist.sys.preactivity");
if ("0".equals(firstBoot)) {
addPreferredActivityForULauncher();
}
SystemProperties.set("persist.sys.preactivity", "1");
mRestoredSettings = mSettings.readLPw();
private void addPreferredActivityForULauncher() {
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.MAIN");
filter.addCategory("android.intent.category.HOME");
filter.addCategory("android.intent.category.DEFAULT");
ComponentName preActivity = new ComponentName("com.android.ulauncher", "com.android.ulauncher.Launcher");
ComponentName[] set = new ComponentName[] {new ComponentName("com.android.launcher", "com.android.launcher2.Launcher"), preActivity};
mSettings.mPreferredActivities.addFilter(
new PreferredActivity(filter, IntentFilter.MATCH_CATEGORY_EMPTY, set, preActivity));
scheduleWriteSettingsLocked();
}
系统有多个Launcher时,会在packages.xml 设置如下信息:
/data/system/packages.xml
如何在启动时自动设置default Launcher呢?
方法一:
在PackageManagerService构造函数中,会读取packages.xml文件:mRestoredSettings = mSettings.readLPw();
所以在之前添加设置:
readPermissions();
String firstBoot = SystemProperties.get("persist.sys.preactivity");
if ("0".equals(firstBoot)) {
addPreferredActivityForULauncher();
}
SystemProperties.set("persist.sys.preactivity", "1");
mRestoredSettings = mSettings.readLPw();
private void addPreferredActivityForULauncher() {
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.MAIN");
filter.addCategory("android.intent.category.HOME");
filter.addCategory("android.intent.category.DEFAULT");
ComponentName preActivity = new ComponentName("com.android.ulauncher", "com.android.ulauncher.Launcher");
ComponentName[] set = new ComponentName[] {new ComponentName("com.android.launcher", "com.android.launcher2.Launcher"), preActivity};
mSettings.mPreferredActivities.addFilter(
new PreferredActivity(filter, IntentFilter.MATCH_CATEGORY_EMPTY, set, preActivity));
scheduleWriteSettingsLocked();
}
方法二:
在ActivityManagerService
boolean startHomeActivityLocked() {
/* launch the defualt launcher when the system boots for the first time */
setDefaultLauncher();
...
}private void setDefaultLauncher(){ // get default component String packageName = SystemProperties.get("ro.sw.defaultlauncherpackage", "no"); String className = SystemProperties.get("ro.sw.defaultlauncherclass", "no"); Slog.i(TAG, "defautl 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 intentList = new ArrayList(); ArrayList cnList = new ArrayList(); 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 list = new ArrayList(); try { list = pm.queryIntentActivities(intent, intent.resolveTypeIfNeeded(mContext.getContentResolver()), PackageManager.MATCH_DEFAULT_ONLY); }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(); 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; } // add the default launcher as the preferred launcher ComponentName launcher = new ComponentName(packageName, className); try { pm.addPreferredActivity(filter, bestMatch, set, launcher); } catch (RemoteException e) { throw new RuntimeException("Package manager has died", e); } } }}
更多相关文章
- 一款常用的 Squid 日志分析工具
- GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
- RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
- Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
- android 编译学习
- Android通知栏学习(基础篇)
- Android开发常用命令行
- Android(安卓)Service 启动流程
- Android学习笔记之获得屏幕属性DisplayMetrics