本文共 4981 字,大约阅读时间需要 16 分钟。
当系统存在多个launcher时,若没有设置默认launcher,开机启动后会弹出提示框,罗列所有launcher,用户选择并设置了默认launcher后,按home键以及以后重启都会进入默认的launcher。
现在,我希望系统能直接就进入我设定的launcher而不是弹出框后选择然后设置
网上大部分的做法就是修改
packages/apps/Provision/src/com/android/DefaultActivity.java
和
frameworks/base/services/java/com/android/server/pm/PackageManagerService.java
两个文件,给个相对比较好看一点的链接
我按照这个做不能达到预期的效果,
/添加内容
后期修改包名,发现开机自启动出现问题,然后弄了两天,终于差不多弄清楚了。果然,欠下的债迟早得还!
其实修改DefaultActivity.java就能够完成开机自启动,只是当时我的程序有问题,所以没有达到预期效果
当然下面修改ActivityManagerService.java也能完成开机自启动
这两者的区别在于
DefaultActivity.java只是在第一次启动时执行,如果修改了默认launcher后不可恢复
ActivityManagerService.java在每次启动时执行,每次都默认启动设定的launcher,当然,如果设定的launcher存在的话,设置其他的launcher为默认会无效,因为重新启动时setDefaultLauncher()会将当前默认launcher清除。只有在卸载了设定默认启动的launcher后才能设置其他launcher为默认启动.
//
修改多次搜索关键字,得到另一篇文章,大致看了下,感觉不会有效,但是已经绝望了就试了试,竟然解决了问题
这篇文章有借鉴之处,直接使用时会发现有些字段是上下文中没有的,故写下此文记录一下。
修改文件
frameworks\base\services\java\com\android\server\am\ActivityManagerService.java
添加一个方法:
private void setDefaultLauncher() {
IPackageManager pm = ActivityThread.getPackageManager();
//判断指定的launcher是否存在
if(hasApkInstalled(packageName)) {
Slog.i(TAG, "defautl packageName = " + packageName + ", default className = " + className);
//清除当前默认launcher
ArrayList<IntentFilter> intentList = new ArrayList<IntentFilter>();
ArrayList<ComponentName> cnList = new ArrayList<ComponentName>();
mContext.getPackageManager().getPreferredActivities(intentList, cnList, null);
IntentFilter dhIF = null;
for(int i = 0; i < cnList.size(); i++) {
//获取所有launcher activity
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
List<ResolveInfo> list = new ArrayList<ResolveInfo>();
try {
//设置默认launcher
ComponentName launcher = new ComponentName(packageName, className);
ComponentName[] set = new ComponentName[N];
int defaultMatch = 0;
for (int i = 0; i < N; i++) {
try {
}//end if
}
private static boolean hasApkInstalled(String pkgname) {
try {
然后在ActivityManagerService类中的
boolean startHomeActivityLocked()
方法第一行调用上面添加的
setDefaultLauncher()
boolean startHomeActivityLocked() {
if (mFactoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL
&& mTopAction == null) {
///
setDefaultLauncher();
///
Intent intent = new Intent(
mTopAction,
mTopData != null ? Uri.parse(mTopData) : null);
intent.setComponent(mTopComponent);
if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {
return true;
}
添加后的方法全部内容如上,重新编译android,烧录,开机就能够自动进入自定义的launcher
可以通过系统设置取消该launcher的默认设置,取消之后按home键会弹出launcher选择提示框
frameworks\base\core\java\com\android\internal\app\ResolverActivity.java
ResolverActivity类就是选择打开方式的弹出框
转载地址:http://hbici.baihongyu.com/