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

问题提出:

      当系统存在多个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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Launcher默认界面配置(default workspace) 2 1 界面默认配置文件 2 2 LauncherProvider java的loadFavorites分析 3 二 Icon修改 界面布局调整 壁纸设置 5 1 图标大小和标题大小 5 2 Launcher 图标加入默认背景 6 3 更换Launcher默认壁纸 7 4 壁纸设置过程: 8 三 Launcher启动和初始化 9 1 Launcher进程启动过程 9 2 Launcher初始化――LauncherApplication 10 3 Launcher java初始化 12 1 Callbacks接口 15 2 数据加载流程 16 4 LoaderTask的run 方法 17 5 workspace加载数据 18 6 workspace绑定数据 20 7 ALL APP数据加载绑定 22 五 HotSeat分析 24 1 Hotseat配置文件 24 2 Hotseat构造函数 26 3 Hotseat加载数据 27 4 Hotseat绑定数据 27 5 Hotseat类 28 6 总结 30 六 页面滑动 PagedView 30 七 AllApp全部应用列表 AppsCustomizeTabHost 38 1 AllApp列表配置文件 38 2 AppsCustomizeTabHost分析 40 3 Tab变化执行onTabChanged 41 八 AllApp界面拖拽元素 42 1 触摸拦截 43 2 handleTouchEvent方法 43 4 拖曳按钮 44 九 Launcher启动APP流程 45 1 WorkSpace触摸 45 2 CellLayout的onInterceptTouchEvent 方法 46 3 WorkSpace的onTouch 事件 47 4 BubbleTextView 48 5 onClick 方法 49 6 总结 50 1 常用类介绍 50 2 Launcher的数据库 51">一 Launcher默认界面配置(default workspace) 2 1 界面默认配置文件 2 2 LauncherProvider java的loadFavorites分析 3 二 Icon修改 界面布局调整 壁纸设置 5 1 图标大小和标题大小 5 2 Launcher 图标加入默认背景 6 3 更换Launcher默认壁纸 7 [更多]
Android设备的默认launcher设置是指系统默认的启动器(Launcher)应用程序。启动器是用户在设备上看到和操作的主屏幕,它提供了桌面、应用程序列表、小部件和壁纸等功能。 在Android设备上,不同的制造商可能会有不同的默认启动器设置,例如Samsung可能会有自己的启动器样式,而Google的Pixel设备则使用原生的Android启动器。 默认启动器有以下几个主要特点和功能: 1. 桌面:默认启动器会在设备主屏幕上显示桌面,用户可以在桌面上添加和管理应用程序、小部件和快捷方式等。 2. 应用程序列表:用户可以通过默认启动器访问设备上安装的所有应用程序的列表,并进行搜索和排序。 3. 小部件:默认启动器支持用户在桌面上添加各种小部件,例如天气、日历、音乐播放器等,以便用户更方便地获取相关信息。 4. 壁纸:默认启动器还允许用户更改桌面背景壁纸,可以选择自己喜欢的图片或者使用系统提供的预设壁纸。 对于用户来说,选择适合自己的默认启动器可以增加使用Android设备的个性化和便利性。用户可以根据自己的需求和偏好,选择不同功能和样式的启动器来进行设置。有些启动器还提供了更多的自定义选项,例如主题、图标包等,使用户能够将设备界面个性化到自己喜欢的样子。 总之,Android设备的默认启动器设置是一个重要的用户体验方面的设置选项,通过它可以实现设备主屏幕的个性化和功能拓展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值