在网上找了好久唯一launcher的实现方式,发现都是一同一个人写的,而且并没有实现这个功能,因为按照这个方式去做的话,当你按下HOME键还是出现了选择launcher的对话框,然后自己研究了一天,找到了最直接有效的而且是最简单的方法实现全局唯一launcher的功能:
修改frameworks\base\core\java\android\content\pm\PackageParser.java,在parseIntent这个私有方法,因为APK在安装的时候会通过这个方法解析Manifest清单文件,然后将每个Activity的intent-filter保存在内存中,所以修改这个方法就相当于修改了内存的应用注册表的信息,也就是偷换概念的做法,等于是在安装的时候就把问题解决了,扼杀在萌芽状态:
修改部分为:
这里xxx随便你输入,例如你在你自己的launcher的Manifest的Activity里Intent-filter里加入:
<category android:name="android.intent.category.HOME.xxx" />
那么在代码里修改的地方的xxx就替换成你自己起的名字
原理就是安装每个APK的时候 只要是launcher ,就把category是HOME的值改成x,只要是你的launcher就把category的值改成HOME,那么全局就只有你一个launcher了
这里是修改的部分:
/*************************************************************************************/
if(Intent.CATEGORY_HOME.equals(value)) {
value = "x";
} else if((Intent.CATEGORY_HOME + ".xxx").equals(value)) {
value = Intent.CATEGORY_HOME;
}
/*************************************************************************************/
使用这种方法修改时必须确保你的launcher被安装了或者放在了syste/app下了且Manifest的Activity里的i