系统多Launcher的情况下,强制启动指定Launcher

平台:Android4.0
场景:客户内置了一个Launcher程序,要求与系统Launcher同时存在,并且第一次开机时,直接启动并显示客户Launcher。
时间:2012.5.20

前提:
正常系统中,若存在多个launcher,第一次刷机后,将不会进入到其中某一个,而会让客户去选择需要使用的launcher。现在需要在第一次刷机后,将其中某一个launcher设置为默认的,并显示出来。
关于这个问题,定位到
frameworks\base\core\java\com\android\internal\app\ResolverActivity.java中。此Activity与系统的所有的应用程序弹出选择框相关。
而关于如何设置默认的launcher,可以跟踪PackageManagerService.java中的addPreferredActivity()函数。每次设置默认的launcher,其实就是在更新/data/system/packages.xml文件中的preferred-activities字段的内容。/data/system/packages.xml这个文件由PackageManagerService.java生成,里面记录了系统当中安装的APK的所有属性,权限等信息。当系统中的APK安装、删除、升级时,文件就会被更新。
另外,我们需要使用getPackageManager().queryIntentActivities()方法,通过Intent的Intent.CATEGORY_HOME来过滤出系统中所存在的launcher。

修改:
本来打算在开机标志被设为1之前,即ActivityManagerService.java中的sys.boot_completed=1,进行截断并设置默认launcher。但尝试后发现,在这个时间点通过addPreferredActivity()去设置,有效果,但此时那个选择框已经显示出来。此时按HOME按键的话,是会到设置的默认的launcher。想在选择框弹出前进行设置?找到了ActivityManagerService.java中的startHomeActivityLocked()函数,在其函数开始的阶段进行addPreferredActivity()的调用,但是无效。究其原因,应该是此时packages.xml还在创建写入中,从而addPreferredActivity()函数无效了。
因此最后将修改放到了ResolverActivity.java中,对选择框的显示进行截断并设置默认launcher。
系统开机,为什么会先启动launcher?在startHomeActivityLocked()函数中给出了答案。在ActivityStack.java的resumeTopActivityLocked()函数中,要确保栈顶是有activity的!若栈顶没有程序,此时则调用startHomeActivityLocked()函数,进而启动launcher。

你可能感兴趣的:(系统多Launcher的情况下,强制启动指定Launcher)