您的位置:首页 > 移动开发 > Android开发

Android系统存在多个Launcher时,设置开机进入默认的Launcher

2015-11-20 16:31 656 查看
问题提出:

当系统存在多个Launcher时,开机完成并解锁后,系统会弹出一个选择框让用户选择

进入哪一个Launcher,如果不想选择,而是想直接进入某一个默认的Launcher,并且

用户在设置->应用程序->管理应用程序->所有应用程序列表,找到之前设置的那个默

认的Launcher,并且取消了默认值,可以重新弹出launcher选框。

解决方法:

下面以设置Google

Launcher2作为默认启动的Launcher为例,

其package name 为 com.android.launcher

launcher activity name 为 com.android.launcher2.Launcher

需要以下两个修改点

1)修改Provision应用

编辑packages/apps/Provision/src/com/android/DefaultActivity.java文件
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0 *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.android.provision;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;

import java.util.List;

/**
* Application that sets the provisioned bit, like SetupWizard does.
*/
public class DefaultActivity extends Activity {

private static final String TAG = "DefaultActivity";

@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);

//新增这个函数的调用
setupDefaultLauncher();

// Add a persistent setting to allow other apps to know the device has been provisioned.
Settings.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);

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

// terminate the activity.
finish();
}

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

String examplePackageName = "com.bluegod.launcher"; //请修改为需要设置的 package name
String exampleActivityName = "com.android.launcher2.Launcher"; //请修改为需要设置的 launcher activity name

ComponentName defaultLauncher = null;

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; ) {
final ResolveInfo r = resolveInfoList.get(j);
if (!r.activityInfo.packageName.equals(examplePackageName)) {
resolveInfoList.remove(j);
size -= 1;
} else {
j++;
}
}
ComponentName[] set = new ComponentName[size];
defaultLauncher = new ComponentName(examplePackageName, exampleActivityName);
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);
}
}
}


在setComponentEnabledSetting函数调用之前,新增setupDefaultLauncher()函数的调用。

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

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

2)修改框架文件修改

PackageManagerService.java


framework/base/services/java/com/android/server/pm/PackageManagerService.java该文件中找到 findPreferredActivity

方法

,将此方法的比较靠后的一段代码if
(!pa.mPref.sameSet(query, priority)) { 添加如下语句

// Okay we found a previously set preferred app.
// If the result set is different from when this
// was created, we need to clear it and re-ask the
// user their preference.
/*if (!pa.mPref.sameSet(query, priority)) {
Slog.i(TAG, "Result set changed, dropping preferred activity for "
+ intent + " type " + resolvedType);
pir.removeFilter(pa);
return null;
}*/

if (!pa.mPref.sameSet(query, priority)) {
if (!(intent.getAction() != null
&& intent.getAction().equals(intent.ACTION_MAIN)
&& intent.getCategories() != null
&& intent.getCategories().contains(intent.CATEGORY_HOME))) //添加
{  //添加这行
Slog.i(TAG, "Result set changed, dropping preferred activity: "
+ intent + " type " + resolvedType);
pir.removeFilter(pa);
return null;
}  //添加这行
Slog.i(TAG, "Result set not change, not drop preferred activity special intent: " + intent);//添加这行
}


替换上面/* */注释部分的代码,说白了主要增加一个if语句的判断

if (!(intent.getAction() != null
&& intent.getAction().equals(intent.ACTION_MAIN)
&& intent.getCategories() != null
&& intent.getCategories().contains(intent.CATEGORY_HOME)))


如果非Launcher,则执行removeFilter()。

OK,经过以上两个修改,就可以做到开机后设置Google Launcher2作为默认启动的Launcher

原文:http://www.xuebuyuan.com/2141597.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: