多语言展示
当前在线:653今日阅读:23今日分享:25

Android4.0.4唯一Launcher实现

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

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

2

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

3

if ((Intent.CATEGORY_HOME + ".XINU").equals(value)) {        value = Intent.CATEGORY_HOME;} else if (Intent.CATEGORY_HOME.equals(value)) {        value = "HOME_XINU_IGNORE";}

4

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

5

android.intent.category.HOME

6

修改为

7

android.intent.category.HOME.XINU

8

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

9

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

10

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

11

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

12

if (android.os.SystemProperties.get("persist.xinu.boot_flag","true").equals("false")) {         "上面添加的语句"}

13

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

14

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

15

前添加如下语句:

16

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

17

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

18

on property:init.svc.bootanim=stopped        setprop persist.xinu.boot_flag false

19

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

20

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

推荐信息