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文件
在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)) { 添加如下语句
替换上面/* */注释部分的代码,说白了主要增加一个if语句的判断
如果非Launcher,则执行removeFilter()。
OK,经过以上两个修改,就可以做到开机后设置Google Launcher2作为默认启动的Launcher
原文:http://www.xuebuyuan.com/2141597.html
当系统存在多个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
相关文章推荐
- Android 防住用户查看文件和文件夹思路
- Android SimpleCursorAdapter的使用
- Android5.1 设置壁纸流程简析
- Android三类传感器-动作传感器-位置传感器-环境传感器
- Android WindowManager实现悬浮窗效果 (一)——与当前Activity绑定
- Android实现高斯模糊
- Android InputEvent(Motion/Key/Sleep....) 流程跟踪
- Android错误——android.content.res.Resources$NotFoundException:
- Android开发之Notification详解
- Android ResourcCursorAdapter的使用
- Android 时间轴效果
- Android 热更新是如何实现的?
- Android——高德地图简单定位小工具
- Android 学习笔记之使用多线程实现断点下载...
- android应用开发——popupWindow非全屏显示
- Android多点触摸交互处理
- Android Service AIDL
- Android 内存分析
- Android 属性动画
- Android 开发之基类(一)