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

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. 解决init: sys_prop: permission denied uid:1003 name:service.
  3. Android(安卓)完全退出应用程序back和home键
  4. Android(安卓)Studio中如何解决重复依赖导致的app:transformClas
  5. 【android】平滑Activity过渡动画效果,类库已分离,使用只需1行代码
  6. android添加开机音乐
  7. Android常见的几种RuntimeException
  8. Android中利用Handler实现消息的分发机制(一)
  9. 解决 android-apt plugin is incompatible with the Android(安

随机推荐

  1. 在英特尔® 架构平台上开发和优化基于 ND
  2. Android 学习论坛博客及网站推荐
  3. 一步步探索学习Android Touch事件分发传
  4. android之CalendarView日历视图
  5. PC与Android设备通过USB建立通信连接
  6. Android帮助文档翻译——开发指南(十五)获
  7. 【android开发】解析xml文件①
  8. 桌面云的三种模式 VDI IDV VOI (笔记)
  9. Android imageview图片缩放实现
  10. 如何使用自己的makefile编译android ndk