Android内置多个launcher设置默认launcher
16lz
2021-01-24
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平台即内置的应用,其他平台皆可使用该方法.
更多相关文章
- Android(安卓)Java层UI渲染实现一(Context的创建)
- Android(安卓)简单实现倒计时功能
- Android系统服务Fuzz测试
- webview的白屏,和硬件加速
- Android-工作遭遇-URLConnection原生请求http和https忽略证书
- Android(安卓)-- AppWidget 高级篇
- windows10 环境下编译 Android(安卓)Pjsip的os 库
- 初识android 自定义控件
- 用Fragments在Android中进行多窗格开发