Android(安卓)系统设置默认launcher
16lz
2021-01-25
Android 项目中需要设置默认launcher,下面介绍如何设置,在ActivityManagerService的startHomeActivityLocked方法中会判断当前是否有默认launcher,如果没有的话,就会弹出选择框.下面将设置默认launcher的代码列出如下:
private void setDefaultLauncher() { // get default component String packageName = "com.vc";//默认launcher包名 String className = "com.vc.activity.HomeActivity";////默认launcher入口 IPackageManager pm = ActivityThread.getPackageManager(); //判断指定的launcher是否存在 if (hasApkInstalled(packageName)) { Slog.i(TAG, "defautl packageName = " + packageName + ", default className = " + className); //清除当前默认launcher ArrayList intentList = new ArrayList(); ArrayList cnList = new ArrayList(); mContext.getPackageManager().getPreferredActivities(intentList, cnList, null); IntentFilter dhIF = null; 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 list = new ArrayList(); try { list = pm.queryIntentActivities(intent, intent.resolveTypeIfNeeded(mContext.getContentResolver()), PackageManager.MATCH_DEFAULT_ONLY, getCurrentUserIdLocked()); } 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(); //设置默认launcher ComponentName launcher = new ComponentName(packageName, className); ComponentName[] set = new ComponentName[N]; int defaultMatch = 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======= " + r.activityInfo.packageName); Slog.d(TAG, "r.activityInfo.name========= " + r.activityInfo.name); if (launcher.getClassName().equals(r.activityInfo.name)) { defaultMatch = r.match; } } try { pm.addPreferredActivity(filter, defaultMatch, set, launcher, getCurrentUserIdLocked()); } catch (RemoteException e) { throw new RuntimeException("Package manager has died", e); } } } private boolean hasApkInstalled(String packageName) { if (packageName == null || "".equals(packageName)) return false; android.content.pm.ApplicationInfo info = null; try { info = mContext.getPackageManager().getApplicationInfo(packageName, 0); return info != null; } catch (NameNotFoundException e) { return false; } }
然后在ActivityManagerService中的startHomeActivityLocked方法第一行调用setDefaultLauncher().就可以设置成功了~
boolean startHomeActivityLocked(int userId, String reason) { setDefaultLauncher(); //在这里添加方法 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; } Intent intent = getHomeIntent(); ActivityInfo aInfo = resolveActivityInfo(intent, STOCK_PM_FLAGS, userId); ......
转载:https://blog.csdn.net/michael_yt/article/details/78112262
更多相关文章
- 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
- 解决init: sys_prop: permission denied uid:1003 name:service.
- Android(安卓)完全退出应用程序back和home键
- Android(安卓)Studio中如何解决重复依赖导致的app:transformClas
- 【android】平滑Activity过渡动画效果,类库已分离,使用只需1行代码
- android添加开机音乐
- Android常见的几种RuntimeException
- Android中利用Handler实现消息的分发机制(一)
- 解决 android-apt plugin is incompatible with the Android(安