0
点赞
收藏
分享

微信扫一扫

android 当系统存在多个Launcher时,如何设置开机自动进入默认的Launcher?


来自MTK  FAQ

当系统存在多个Launcher时,开机完成并解锁后,系统会弹出一个选择框让用户选择进入哪一个Launcher,如果不想选择,而是想直接进入某一个默认的Launcher,并且用户在设置->应用程序->管理应用程序->所有应用程序列表,找到之前设置的那个默认的Launcher,并且取消了默认值,可以重新弹出launcher选框。

下面以设置Google Launcher2作为默认启动的Launcher为例,其包名为com.android.launcher2

packages/apps/Provision/src/com/android/DefaultActivity.java文件

       ......

// remove this activity from the package manager.
PackageManager pm = getPackageManager();

//add start
Intent intent=new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
List<ResolveInfo> resolveInfoList = pm.queryIntentActivities(intent, 0);
if(resolveInfoList != null){
int size = resolveInfoList.size();
for(int j=0;j<size;j++){
final ResolveInfo r = resolveInfoList.get(j);
if(r.activityInfo.packageName.equals(this.getPackageName())){ //attention
resolveInfoList.remove(j);
size -= 1;
j--;
}
}

ComponentName[] set = new ComponentName[size];
ComponentName defaultLauncher=new ComponentName("com.android.launcher2", "com.android.launcher2.Launcher");
int defaultMatch=0;
for(int i=0;i<size;i++){
final ResolveInfo resolveInfo = resolveInfoList.get(i);
Log.d(TAG, resolveInfo.toString());
set[i] = new ComponentName(resolveInfo.activityInfo.packageName,resolveInfo.activityInfo.name);
if(defaultLauncher.getClassName().equals(resolveInfo.activityInfo.name)){
defaultMatch = resolveInfo.match;
}
}
Log.d(TAG,"defaultMatch="+Integer.toHexString(defaultMatch));
IntentFilter filter=new IntentFilter();
filter.addAction(Intent.ACTION_MAIN);
filter.addCategory(Intent.CATEGORY_HOME);
filter.addCategory(Intent.CATEGORY_DEFAULT);
pm.clearPackagePreferredActivities(defaultLauncher.getPackageName());
pm.addPreferredActivity(filter, defaultMatch, set, defaultLauncher);
}
//add end

// remove this activity from the package manager.
ComponentName name = new ComponentName(this, DefaultActivity.class);
pm.setComponentEnabledSetting(name,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);

       ......

然后修改packages/apps/Provision/AndroidManifest.xml文件,增加以下语句:

<uses-permission android:name=”android.permission.SET_PREFERRED_APPLICATIONS” />

说明:上面添加的代码中,需要注意如下这个if判断条件写法不是唯一的,如果按照FAQ的写法,设置默认Launcher不成功,则要根据系统当前apk的情况来做修改;

if(r.activityInfo.packageName.equals(this.getPackageName())){

 

不成功的原因是:系统有其他的apk也会接收Intent.ACTION_MAIN,CATEGORY_HOME的intent,而这些apk又不是Launcher程序(启动器程序);

这种情况下就需要在这个if判断中将这些apk的相应Activity剔除掉;

 

例如:Settings中有一个activity:CryptKeeper,它也会接收HOME intent,那么if判断就需要改为如下所示:

if(r.activityInfo.packageName.equals(this.getPackageName()) || r.activityInfo.name.equals("com.android.settings.CryptKeeper") ){

 

如果按照FAQ的写法,发现设置默认Launcher不成功,如何判断需要剔除哪些activity呢?

方法如下:在download完第一次开机时,用adb logcat -v time >main.log抓取main log,搜索DefaultActivity这个tag,因为在上面添加代码中,

 Log.d(TAG, resolveInfo.toString()); 这条语句会打印出resolveInfoList中每条记录的值,如果发现其中某一条记录不是Launcher程序,那么就在上面的if判断中,添加相应判断条件即可。

 

备注:上面所添加的全部代码,一定要放在pm.setComponentEnabledSetting这两行语句之前,如果放在这个语句后面,那所添加的代码就无法执行了,导致设置失效。这里的com.android.launcher2是Google默认的Launcher2,可以根据自己的需要来定制,让系统进入指定的那个Launcher。



举报

相关推荐

0 条评论