Android4.0.4唯一Launcher实现

2026-01-14 19:01:19

最近想对Android进行改造一番,不想让系统默认的Launcher被替换掉,即按HOME键后一直是返回系统默认的主界面,而后其安装的Launcher(如Go Launcher等)则不会成为主界面,即按HOME键后不会返回安装的Launcher,也不会弹出主界面选择框。

方法/步骤

最近想对Android进行改造一番,不想让系统默认的Launcher被替换掉,即按HOME键后一直是返回系统默认的主界面,而后其安装的Launcher(如Go Launcher等)则不会成为主界面,即按HOME键后不会返回安装的Launcher,也不会弹出主界面选择框。

在网上找了一些参考资料,后来想想,直接在安装的时候绕过吧,将问题消灭在萌芽阶段吧,就直接修改了frameworks/base/core/java/android/content/pm/PackageParser.java文件,在private boolean parseIntent函数里的else if (nodeName.equals("category"))分支的XmlUtils.skipCurrentTag(parser);和outInfo.addCategory(value);中间添加如下代码:

if ((Intent.CATEGORY_HOME + ".XINU").equals(value)) {

        value = Intent.CATEGORY_HOME;

} else if (Intent.CATEGORY_HOME.equals(value)) {

        value = "HOME_XINU_IGNORE";

}

再修改packages/apps/Launcher2/AndroidManifest.xml文件,将

android.intent.category.HOME

修改为

android.intent.category.HOME.XINU

然后编译烧录,再次运行,发现HOME键用不了了,为什么会这样呢?直接在上面加上如下语句:

Slog.w(TAG,"Xinu Value="+value);

再次编译烧录后发现,HOME_XINU_IGNORE这个值打印了3次,而CATEGORY_HOME打印了1次,可能启动时会有其他也使用到CATEGORY_HOME而被过滤掉了,故而加了如下处理,用于绕过在烧录后第一次启动加载时不进行上面的过滤处理:

在上面的PackageParser.java文件添加的判断语句再用一个判断语句来包含:

if (android.os.SystemProperties.get("persist.xinu.boot_flag","true").equals("false")) {

         "上面添加的语句"

然后在frameworks/base/services/java/com/android/server/EntropyService.java文件中的如下语句:

Slog.w(TAG, "unable to load initial entropy (first boot?)", e);

前添加如下语句:

android.os.SystemProperties.set("persist.xinu.boot_flag","true");

接下来来修改init.rc文件,添加如下语句:

on property:init.svc.bootanim=stopped

        setprop persist.xinu.boot_flag false

至此,再次编译烧录后,无论安装什么其他的Launcher,按HOME键均会回到系统默认的Launcher,如果要替换为我们自己的Launcher,必须将其放至/system/app目录下打包,如果该APK有库,那需要把库放至/system/lib目录下。

该实现非常适合于品牌厂商ODM产品,这样无论如何都能返回自己的主界面了。(上面修改基于Android4.0.4)

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢