Android系统存在多个Launcher时,设置开机进入默认的Launcher
来源:互联网 发布:深孔钻编程视频教程 编辑:程序博客网 时间:2024/05/17 00:04
问题提出:
当系统存在多个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
- android 当系统存在多个Launcher时,如何设置开机自动进入默认的Launcher?
- android 当系统存在多个Launcher时,如何设置开机自动进入默认的Launcher
- android 当系统存在多个Launcher时,如何设置开机自动进入默认的Launcher?
- android 当系统存在多个Launcher时,如何设置开机自动进入默认的Launcher?
- android 当系统存在多个Launcher时,如何设置开机自动进入默认的Launcher?
- Android系统存在多个Launcher时,设置开机进入默认的Launcher
- Android系统存在多个Launcher时,设置开机进入默认的Launcher
- Android 当系统存在多个Launcher时,如何设置开机自动进入默认的Launcher?
- android 系统存在多个Launcher时,设置开机自动进入默认的Launcher
- Android系统存在多个Launcher时,设置开机进入默认的Launcher
- 当系统存在多个Launcher时,如何设置开机自动进入默认的Launcher?
- 系统存在多个Launcher时,如何设置开机自动进入默认的Launcher
- 当系统存在多个Launcher时,如何设置开机自动进入默认的Launcher?
- 当系统存在多个Launcher时,如何设置开机自动进入默认的Launcher?
- 当系统存在多个Launcher时,如何设置开机自动进入默认的Launcher?
- Android系统:当系统存在多个Launcher时,如何设置开机自动进入默认的Launcher?
- android 当系统存在多个Launcher时,如何设置开机自动进入默认的Launcher2
- android 当系统存在多个Launcher时,如何设置开机自动进入默认的Launcher2
- Android基础 : Android ContentProvider和getContentResolver
- Abstract Factory模式
- 必学算法--革命尚未成功,同志仍需努力
- Android软键盘的隐藏显示研究
- 经纬财富:湛江现货白银结算时间
- Android系统存在多个Launcher时,设置开机进入默认的Launcher
- 高考失利——学什么技术能高薪就业?
- 通信图
- HTTP基本认证(Basic Authentication)的JAVA示例
- mapreduce编程实例(7)-求所有用户ID
- SourceKitService Terminated Editor functionality temporarily limited.
- Facade模式
- 遇到 Form 性能问题怎么办 performance issue
- c++的重载、覆盖和遮蔽(隐藏)