广告
返回顶部
首页 > 资讯 > 移动开发 >Android10 设置默认Launcher
  • 588
分享到

Android10 设置默认Launcher

androidandroidstudioide 2023-10-05 13:10:25 588人浏览 薄情痞子
摘要

不保留系统launcher 在mk文件中添加这个属性LOCAL_OVERRIDES_PACKAGES := Launcher3 对应的mk中删除,不让其编译即可。 保留系统默认的Launcher 当系统存在多个launcher时,若没有设置

  1. 不保留系统launcher
    在mk文件中添加这个属性LOCAL_OVERRIDES_PACKAGES := Launcher3 对应的mk中删除,不让其编译即可。
  2. 保留系统默认的Launcher

当系统存在多个launcher时,若没有设置默认launcher,开机启动后会弹出提示框,罗列所有launcher,用户选择并设置了默认launcher后,按home键以及以后重启都会进入默认的launcher。亦或者在设置--》应用和通知--》默认应用--》主屏幕应用 中也可设置默认launcher。

客户希望系统能直接就进入我设定的launcher而不是弹出框后选择然后设置

前提:客户的app需要有home属性

                

修改方法:

首先我们需要增加全局属性Settings.Global.DEFAULT_LAUNCHER,,客户可通过修改该属性设置自定义桌面

1:增加自定义属性://frameworks\base\core\java\Android\provider\Settings.java  public static final class Global extends NameValueTable {        public static final String DEFAULT_LAUNCHER = "my_default_launcher";  }public static final class System extends NameValueTable {     public static final String DEFAULT_LAUNCHER = Global.DEFAULT_LAUNCHER;     PUBLIC_SETTINGS.add(DEFAULT_LAUNCHER);     MOVED_TO_GLOBAL.add(Settings.Global.DEFAULT_LAUNCHER);     }frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java private void loadGlobalSettings(sqliteDatabase db) {      loadStringSetting(stmt, Settings.Global.DEFAULT_LAUNCHER,                    R.string.default_launcher); }               //frameworks\base\packages\SettingsProvider\res\values\defaults.xmlcom.android.launcher3/com.android.launcher3.Launcher

两种方法可选:

  • 修改弹出框界面直接设置launcher,弹出提示框界面是:frameworks/base/core/java/com/android/internal/app/ResolverActivity.java:修改方法:在configureContentView内直接读取自定义的桌面,然后替代launcher3
1:frameworks/base/core/java/com/android/internal/app/ResolverActivity.java 的configureContentView 读取设置的默认桌面,进行设置,mResolvingHome就是表示需要选择的是不是home在这里只针对home作处理。public boolean configureContentView(List payloadIntents, Intent[] initialIntents,        List rList) {  //....    if (rebuildCompleted) {        //....        //phoebe add for default launcher for prop Settings.Global.DEFAULT_LAUNCHER        if(mResolvingHome){               String defaultlauncher = Settings.Global.getString(getContentResolver(), Settings.Global.DEFAULT_LAUNCHER);        final TargetInfo defaultTarget = mAdapter.targetInfoForDefault(defaultlauncher);        Log.d(TAG, "zmm add for configureContentView:defaultlauncher:" + defaultlauncher + ":" + defaultTarget);        if (defaultTarget != null) {            safelyStartActivity(defaultTarget);            mPackageMonitor.unreGISter();            mRegistered = false;            finish();            return true;        }             }            }}2:在ResolveListAdapter 增加targetInfoForDefault方法,并且在rebuildList成功以后,再次设置默认laucnher    public class ResolveListAdapter extends BaseAdapter {        @Nullablepublic TargetInfo targetInfoForDefault(String info) {    if (TextUtils.isEmpty(info)) {        return null;    }    //com.yjx.inoexdash/com.yjx.inoexdash.ui.main.MainActivity    String[] namesArray = info.trim().split("/");    if (namesArray == null || namesArray.length < 2) {        return null;    }    String packageName = namesArray[0];    String activityInfo = namesArray[1];    if (TextUtils.isEmpty(packageName) || TextUtils.isEmpty(activityInfo)) {        return null;    }    ComponentName componentName = new ComponentName(packageName.trim(), activityInfo.trim());    Log.d(TAG, "zmm add for targetInfoForDefault:" + componentName + ":" + mDisplayList.size());    for (TargetInfo targetInfo : mDisplayList) {        ComponentName targetComponentName = targetInfo.getResolvedComponentName();        if (componentName.equals(targetComponentName)) {            return targetInfo;        }    }    return null;}    private void postListReadyRunnable() {    if (mPostListReadyRunnable == null) {        mPostListReadyRunnable = new Runnable() {            @Override            public void run() {                //phoebe add for default launcher for prop Settings.Global.DEFAULT_LAUNCHER               String defaultlauncher = mResolvingHome ? Settings.Global.getString(context.getContentResolver(), Settings.Global.DEFAULT_LAUNCHER) : null;                final TargetInfo defaultTarget = TextUtils.isEmpty(defaultlauncher) ? null : mAdapter.targetInfoForDefault(defaultlauncher);                Log.d(TAG, "zmm add for postListReadyRunnable defaultlauncher:" + defaultlauncher + ":" + defaultTarget);                if (defaultTarget != null) {                    safelyStartActivity(defaultTarget);                    finish();                    return;                }                setHeader();                resetButtonBar();                onListRebuilt();                mPostListReadyRunnable = null;            }        };        getMainThreadHandler().post(mPostListReadyRunnable);    }}}    

修改ActivityManagerService 跳过ResolverActivity

1:ActivityStartController 的startHomeActivity方法内读取用户设置的桌面,并且跳过Settings,和Provision因为第一次开机,会先Settings的CrypTKEeper(加密),FallbackHome(设备正在启动中)接着是provision 的默认桌面,再是launcher3的Launcher页面zmm add for startHomeActivity...com.android.settings.CryptKeeper:ComponentInfo{com.android.settings/com.android.settings.CryptKeeper}   zmm add for startHomeActivity...com.android.settings.FallbackHome:ComponentInfo{com.android.settings/com.android.settings.FallbackHome}   zmm add for startHomeActivity...com.android.provision.DefaultActivity:ComponentInfo{com.android.provision/com.android.provision.DefaultActivity}    zmm add for startHomeActivity...com.android.launcher3.Launcher:ComponentInfo{com.android.launcher3/com.android.launcher3.Launcher}//frameworks/base/services/core/java/com/android/server/wm/ActivityStartController.javavoid startHomeActivity(Intent intent, ActivityInfo aInfo, String reason, int displayId) {        final ActivityOptions options = ActivityOptions.makeBasic();        options.setLaunchWindowingMode(WINDOWING_MODE_FULLSCREEN);        if (!ActivityRecord.isResolverActivity(aInfo.name)) {            // The resolver activity shouldn't be put in home stack because when the foreground is            // standard type activity, the resolver activity should be put on the top of current            // foreground instead of bring home stack to front.            options.setLaunchActivityType(ACTIVITY_TYPE_HOME);        }        //phoebe add for default launcher for prop Settings.Global.DEFAULT_LAUNCHER skip settings,Provision        String shortName = (intent == null || intent.getComponent() == null) ? null : intent.getComponent().getPackageName();        if (!isSettingsApp(shortName) && !isProvisionApp(shortName) && setTargetActivityAsPreferredActivity()) {            //Slog.d(TAG, " zmm add for  startHomeActivity as user seetings..");            return;        }         //phoebe add for default launcher for prop Settings.Global.DEFAULT_LAUNCHER skip settings,Provision end       ...    }//判断是不是Settings app    private boolean isSettingsApp(String shortName) {        return shortName != null && shortName.equals("com.android.settings");    }//判断是不是Provision app    private boolean isProvisionApp(String shortName) {        return shortName != null && shortName.equals("com.android.provision");    }//设置用户设置的桌面    private boolean setTargetActivityAsPreferredActivity() {        boolean result = false;        Context context = mService.mContext;        if (context == null)            return result;        String info = Settings.Global.getString(context.getContentResolver(), Settings.Global.DEFAULT_LAUNCHER);        Slog.d(TAG, " zmm add for  setTargetActivityAsPreferredActivity info=" + info);        if (TextUtils.isEmpty(info)) {            return result;        }        String[] namesArray = info.split("/");        if (namesArray == null || namesArray.length < 2) {            return result;        }        String packageName = namesArray[0];        String activityInfo = namesArray[1];        if (TextUtils.isEmpty(packageName) || TextUtils.isEmpty(activityInfo)) {            return result;        }        IntentFilter filter = new IntentFilter();        filter.addAction("android.intent.action.MAIN");        filter.addCateGory("android.intent.category.HOME");        filter.addCategory("android.intent.category.DEFAULT");        Intent intent = new Intent(Intent.ACTION_MAIN);        intent.addCategory(Intent.CATEGORY_HOME);        packageName = packageName.trim();        activityInfo = activityInfo.trim();        PackageManager pm = context.getPackageManager();        List list = pm.queryIntentActivities(intent, 0);        final int N = list == null ? 0 : list.size();        ComponentName[] set = new ComponentName[N];        ComponentName componentName = null;        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;            if (packageName.equals(r.activityInfo.packageName) && activityInfo.equals(r.activityInfo.name)) {                 componentName = set[i];            }        }//        Slog.e(TAG, "zmm add for setTargetActivityAsPreferredActivity newcomponentName=" + componentName);        if (null != componentName) {            pm.replacePreferredActivity(filter, IntentFilter.MATCH_CATEGORY_EMPTY, set, componentName);            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);            context.startActivity(intent);            result = true;        }        return result;    }2:接着修改frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java,需要把用户在设置--》默认应用中选择的桌面应用保存到自定义的属性中。ComponentName getHomeActivitiesAsUser(List allHomeCandidates,            int userId) {      ...        for (int i = 0; i < resolveInfosSize; i++) {            ResolveInfo resolveInfo = resolveInfos.get(i);            if (resolveInfo.activityInfo != null && TextUtils.equals(                    resolveInfo.activityInfo.packageName, packageName)) {                        //phoebe add start                ComponentName componentName = new ComponentName(resolveInfo.activityInfo.packageName,                        resolveInfo.activityInfo.name);                Slog.d(TAG, "zmm add for getHomeActivitiesAsUser:com:"+componentName);                String value = resolveInfo.activityInfo.packageName + "/" + resolveInfo.activityInfo.name;                android.provider.Settings.Global.putString(mContext.getContentResolver(),                        android.provider.Settings.Global.DEFAULT_LAUNCHER, value);                        //phoebe add end                return componentName;            }        }        return null;    }

以上两种都可实现根据用户配置切换默认launcher

1:adb  切换adb shell settings put global my_default_launcher com.android.launcher3/com.android.launcher3.Launcher2:app可如此调用:Settings.Global.putString(getContentResolver(), "my_default_launcher", "com.yjx.inoexdash/com.yjx.inoexdash.ui.main.MainActivity");

客户的app如果是普通的三方app,设置Global属性可能是报错没有权限:

Settings.Global.putString(getContentResolver(), "my_default_launcher", "com.yjx.inoexdash/com.yjx.inoexdash.ui.main.MainActivity");报错:缺少权限:Manifest.permission.WRITE_SECURE_SETTINGS该权限是系统app才能申请的权限,普通app申请不到的话,我们可以去掉该限制。diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -1249,18 +1250,23 @@ public class SettingsProvider extends ContentProvider {     private boolean mutateGlobalSetting(String name, String value, String tag,             boolean makeDefault, int requestingUserId, int operation, boolean forceNotify,             int mode) {-        // Make sure the caller can change the settings - treated as secure. -       enforceWritePermission(Manifest.permission.WRITE_SECURE_SETTINGS);                         String pkg = "com.android.settings"; //数据写入时使用系统settings应用的包名,系统会进行调用进程的包名判断         if(!"my_default_launcher".equals(name)){  //phoebe add 自定义数据不进行权限验证              pkg = "";              // Make sure the caller can change the settings - treated as secure.              enforceWritePermission(Manifest.permission.WRITE_SECURE_SETTINGS);            }//下面修改在插入操作时使用上面预设的包名,绕过包名验证@@ -1268,7 +1274,7 @@ public class SettingsProvider extends ContentProvider {                 case MUTATION_OPERATION_INSERT: {                     return mSettingsRegistry.insertSettingLocked(SETTINGS_TYPE_GLOBAL, UserHandle.USER_SYSTEM, name, value, tag, makeDefault,-getCallingPackage(), forceNotify, CRITICAL_GLOBAL_SETTINGS);+"".equals(pkg)?getCallingPackage():pkg, forceNotify,  CRITICAL_GLOBAL_SETTINGS);                 }

每日语录:滴水穿石!!!加油!!!

单曲循环《如愿》

来源地址:https://blog.csdn.net/androidzmm/article/details/128285753

--结束END--

本文标题: Android10 设置默认Launcher

本文链接: https://www.lsjlt.com/news/423742.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android10 设置默认Launcher
    不保留系统launcher 在mk文件中添加这个属性LOCAL_OVERRIDES_PACKAGES := Launcher3 对应的mk中删除,不让其编译即可。 保留系统默认的Launcher 当系统存在多个launcher时,若没有设置...
    99+
    2023-10-05
    android android studio ide
  • android怎么设置默认launcher
    要设置Android的默认启动器(launcher),请按照以下步骤操作:1. 打开Android设备的“设置”应用程序。2. 滚动...
    99+
    2023-09-12
    android
  • Android 10.0 当系统内置两个Launcher时默认设置Launcher3以外的那个Launcher为默认Launcher
    1.概述 在10.0定制化开发中,由于产品开发需要要求系统内置两个Launcher,一个是Launcher3,一个是自己开发的Launcher,当系统启动Launcher时, 不要弹出Launcher选择列表 选择哪个Launcher要求默...
    99+
    2023-08-31
    android framework 两个laucher设置默认的 设置默认launcher 去掉默认弹窗
  • android设置默认launcher的方法是什么
    要设置默认的launcher,可以按照以下步骤进行操作:1. 打开手机的设置菜单。2. 在设置菜单中,找到并点击“应用”或“应用管理...
    99+
    2023-09-22
    android
  • @value设置默认值
    背景 如果使用了@value注解来注入一些配置文件中配置的数据,但是这个配置其实在不使用时,可以选择不维护在配置文件中,从而避免一些不必要的配置出现在配置文件中,此时启动项目会报错,因为缺少了@...
    99+
    2023-09-04
    java
  • [Linux] 设置默认python
    linux中往往会安装很多个版本的python, 所以会牵扯到默认python的设置问题. 主要是设置系统环境变量的问题. 1. 查看当前默认python版本 直接在terminal中输入”python” $ python Pyt...
    99+
    2023-01-31
    Linux python
  • linux 设置默认网关
    要设置默认网关,可以使用以下命令:1. 打开终端。2. 使用 `ip route` 命令查看当前的网络路由表。3. 找到默认网关的 ...
    99+
    2023-09-15
    LINUX
  • jquery设置默认图片
    在网页设计中,经常需要在页面中插入图片,以丰富页面内容,提高用户体验。但是在实际开发中,不可避免会出现图片加载失败、不存在等问题,而页面上空白的图片往往会影响用户的观感。为了解决这个问题,我们可以通过设置默认图片的方式来提高用户体验,为此我...
    99+
    2023-05-24
  • 设置默认打印机怎么设置
    设置默认打印机的步骤:1、打开"控制面板";2、在"控制面板"中,找到并点击"设备和打印机"选项;3、在打印机列表中,找到你想要设置为默认打印机的设备,右键点击该设备的图标,然后选...
    99+
    2023-08-14
  • MySQL怎么设置默认值
    在MySQL中,可以通过以下两种方式设置默认值: 在创建表时设置默认值: 可以在CREATE TABLE语句中为列指定默认值。例...
    99+
    2023-10-24
    MySQL
  • mysql怎样设置默认值
    这篇文章主要介绍mysql怎样设置默认值,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!mysql设置默认值的方法:用mysql建数据表设置默认值,代码为【stuSex varcha&...
    99+
    2022-10-18
  • navicat怎么设置默认值
    navicat中设置默认值的方法:1、打开navicat工具;2、连接数据库;3、选择需要设置默认值的数据表;4、右键打开设计表页面;5、选择需要设置默认值的字段;6、最后在底部默认值一栏中进行设置即可。具体操作步骤:打开navicat管理...
    99+
    2022-10-16
  • xp如何设置默认打印机 图文教你设置默认打印机
      如果我们的电脑安装了两台或两台以上的打印机,或者在局域网内设置了几台共享打印机,我们需要设置一台打印机为默认的打印机,即我们点击打印后,系统默认自动选择一台打印机   1、单击“开始”按钮,在...
    99+
    2023-05-29
    xp 打印机
  • win10默认拼音输入法怎么设置?win10默认输入法设置方法
      Win10的微软拼音输入法默认开启的都是中文输入模式,那么默认输入法可以更改吗下文小编就为大家带来win10默认输入法的设置方法,感兴趣的朋友一起去了解下吧。   在升级到Win   1.在“时间和语言&...
    99+
    2023-06-11
    win10 拼音输入法 拼音输入 设置 输入法
  • win10电脑tls安全设置设置为默认设置
    这篇文章主要介绍了win10电脑tls安全设置设置为默认设置,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。win10电脑tls安全设置怎么设置为默认设置在此电脑图标上单击右键...
    99+
    2023-06-10
  • datepicker如何设置默认日期
    要设置DatePicker的默认日期,您可以使用`setDefaultDate()`方法。下面是一个示例代码,展示了如何将默认日期设...
    99+
    2023-09-14
    datepicker
  • rocketdock如何恢复默认设置
    要恢复RocketDock的默认设置,可以按照以下步骤操作:1. 打开RocketDock应用程序。2. 在RocketDock的任...
    99+
    2023-09-28
    rocketdock
  • mysql默认时间如何设置
    今天小编给大家分享一下mysql默认时间如何设置的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2023-04-21
    mysql
  • ubuntu如何设置默认网关
    要设置Ubuntu的默认网关,可以使用以下步骤:1. 打开终端,使用管理员身份运行以下命令以编辑网络配置文件 `/etc/netwo...
    99+
    2023-08-24
    ubuntu
  • java boolean默认值怎么设置
    在Java中,boolean类型的默认值是false。如果需要设置其他值作为默认值,可以使用Boolean包装类来实现。例如,可以使...
    99+
    2023-09-23
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作