Android设置默认launcher

  • 前言
    • 高通 code
    • MTK code
    • 结语

前言

launcher因为开机即启动,若添加默认launcher过早则可能导致其他进程崩溃,添加过晚则起不到启动默认设置的效果且会弹出选择launcher的提示框.
查看了一些其他的修改方法,均需在ActivityManagerService.java的startHomeActivityLocked添加默认启动,但是发现添加后,若系统存在多个launcher apk,则仍然会弹出launcher选择提示框.经过几天折腾,发现一个比较简便且改动不大的方法.
主要思路是发现某些OS自带的apk也添加了

<category android:name="android.intent.category.HOME" />

的响应,且设置了 priority=“1”,则可以保证该应用在Launcher启动前就运行起来.

以下为具体code修改.

高通 code

7.1版本
若有编译 SetupWizard则使用此方法,无则使用 mtk code方法.
vendor\qcom\proprietary\qrdplus\Extension\apps\SetupWizard\src\com\qualcomm\qti\setupwizard\SetupWelcomeActivity.java

private static final String ORIGINAL_LAUNCHER_PACKAGENAME = "com.android.launcher3";//设置为定制的包名private static final String ORIGINAL_LAUNCHER_CLASSNAME = "com.android.launcher3.Launcher";//设置为定制的类名

MTK code

6.0版本
packages\apps\Provision\AndroidManifest.xml
添加 android:sharedUserId=“android.uid.system”

packages\apps\Provision\src\com\android\provision\DefaultActivity.java
onCreate()方法添加

 if(SystemProperties.getInt("persist.sys.defualt.launcher",0)==0)//一次性使用系统变量,为免后续重复调用 initLauncher();

添加initLauncher()方法.

 public void initLauncher (){String ORIGINAL_LAUNCHER_PACKAGENAME = "com.xxx.ilauncher";//包名    String ORIGINAL_LAUNCHER_CLASSNAME = "com.xxx.ilauncher.MainActivity";//类名        Intent queryIntent = new Intent();final PackageManager mPm = this.getPackageManager();        queryIntent.addCategory(Intent.CATEGORY_HOME);        queryIntent.setAction(Intent.ACTION_MAIN);        List<ResolveInfo> homeActivities = mPm.queryIntentActivities(queryIntent, 0);        if(homeActivities == null) {            return ;        }        ComponentName defaultLauncher = new ComponentName(ORIGINAL_LAUNCHER_PACKAGENAME,                ORIGINAL_LAUNCHER_CLASSNAME);        int activityNum = homeActivities.size();        ComponentName[] set = new ComponentName[activityNum];        int defaultMatch = -1;        for(int i = 0; i < activityNum; i++){            ResolveInfo info = homeActivities.get(i);            set[i] = new ComponentName(info.activityInfo.packageName, info.activityInfo.name);            if(ORIGINAL_LAUNCHER_CLASSNAME.equals(info.activityInfo.name)                    && ORIGINAL_LAUNCHER_PACKAGENAME.equals(info.activityInfo.packageName)){                defaultMatch = info.match;            }        }        //if Launcher is not found, do not set anything        if(defaultMatch == -1){            return ;        }        IntentFilter filter = new IntentFilter();        filter.addAction(Intent.ACTION_MAIN);        filter.addCategory(Intent.CATEGORY_HOME);        filter.addCategory(Intent.CATEGORY_DEFAULT);        mPm.addPreferredActivity(filter, defaultMatch, set, defaultLauncher);SystemProperties.set("persist.sys.defualt.launcher",String.valueOf(1));    }

结语

 高通平台8.0版本默认未将SetupWizard 内置,则也可参照mtk code方法修改packages\apps\Provision 中代码即可. Provision为4.4平台即内置的应用,其他平台皆可使用该方法.

更多相关文章

  1. Android(安卓)Java层UI渲染实现一(Context的创建)
  2. Android(安卓)简单实现倒计时功能
  3. Android系统服务Fuzz测试
  4. webview的白屏,和硬件加速
  5. Android-工作遭遇-URLConnection原生请求http和https忽略证书
  6. Android(安卓)-- AppWidget 高级篇
  7. windows10 环境下编译 Android(安卓)Pjsip的os 库
  8. 初识android 自定义控件
  9. 用Fragments在Android中进行多窗格开发

随机推荐

  1. 【学习】考完PMP后 继续学软考!
  2. 用Python自动化生成爱豆日历
  3. 用Python清除文件夹中的重复视频
  4. Deno 核心指南[Git搬运工]
  5. 人物社交网络分析—平凡的世界
  6. 用Node.js把HTML转成PDF格式[每日前端夜
  7. Python数据科学:Logistic回归
  8. Python表白?别傻了,女神是拿来撩的!
  9. 用Node.js创建安全的 GraphQL API[每日前
  10. 奥斯卡,究竟谁一直在陪跑。