Android 应用(4)——将APP设置为主界面Launcher

1、给APP设置HOME属性

将自己开发的APP设置为主界面Launcher,需要添加如下属性:

<category android:name="android.intent.category.HOME" />

e.g.

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.HOME" />
            </intent-filter>
        </activity>

2、给APP设置system属性

设置app system的属性:

android:sharedUserId="android.uid.system"

e.g.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.forlinx.android.audostart"
    android:sharedUserId="android.uid.system">
    <!---->

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">

3、给APP签名

为了设置system属性,就需要对app进行签名:
在这里插入图片描述
app设置system属性和进行签名,涉及到了Android的安全策略部分,可以参考如下链接进行了解:

https://blog.youkuaiyun.com/scottmvp/article/details/115871037
https://blog.youkuaiyun.com/scottmvp/article/details/121602149

编译app并安装到开发板,重新启动开发板,在进入桌面的阶段,会让我们选择要启动的Launcher:默认的Launcher3和我们添加的Launcher。

2、去掉原有的Launcher3

Android10.0默认的主界面程序是谷歌开发的Launcher3,现在有了关闭主界面程序的需求。我们的思路比较简单:去掉Launcher3编译生成的apk。
禁掉Launcher3源码的编译,在源码中去掉Launcher3的编译文件:

mv packages/apps/Launcher3/Android.mk packages/apps/Launcher3/Android.mk.txt
mv packages/apps/Launcher3/SecondaryDisplayLauncher/Android.mk packages/apps/Launcher3/SecondaryDisplayLauncher/Android.mk.txt

删除Launcher3的历史编译结果:

find ./out/ -name "Launcher3*" | xargs rm -rf

重新编译测试,Launcher3主界面程序已经不再启动。

<think>我们正在处理一个关于Android 13 Launcher的特定需求:屏蔽上拉显示应用列表的行为。 根据用户的问题,他想要在Android 13的Launcher中禁止用户通过上拉手势打开应用列表(即所有应用程序的列表)。 分析: 在Android系统中,Launcher3是开源的,我们可以通过修改源码来实现这个功能。 用户提到的是“上拉显示应用列表”,这通常是指在主屏幕底部向上滑动时,会打开应用抽屉(App Drawer)的行为。 我们需要在Launcher3的源码中找到处理上拉手势的地方,并修改它,使其不再触发打开应用抽屉。 参考之前提供的引用[3]中,我们看到了长按事件的处理,但用户需要的是上拉手势,因此我们需要寻找与手势相关的代码。 在Launcher3中,手势检测通常由`TouchController`接口的实现类处理。例如,`AllAppsSwipeController`可能负责处理与应用抽屉相关的手势。 具体步骤: 1.Launcher3的源码中,找到负责处理主屏幕向上滑动的控制器。 2. 修改该控制器的逻辑,使其在上拉手势时不执行打开应用抽屉的操作。 根据经验,我们可以考虑以下文件或类: - `src/com/android/launcher3/uioverrides/touchcontrollers/AllAppsSwipeController.java`:这个类可能处理与应用抽屉相关的手势。 - 或者,在`src/com/android/launcher3/touch`包下可能有其他手势控制器。 在Android 13的Launcher3中,上拉手势可能由`PortraitStatesTouchController`或`AllAppsSwipeController`处理。我们需要找到拦截触摸事件并触发应用抽屉打开的地方。 我们假设用户已经拥有Launcher3的源码,并且可以修改。 修改思路: 我们可以修改手势控制器,使得当检测到上拉手势时,不执行打开应用抽屉的操作,而是什么也不做。 具体代码修改示例: 在`AllAppsSwipeController`(或类似名称的类)中,有一个方法`onDrag`或`onControllerTouchEvent`,它会根据手势的移动来改变应用抽屉的状态。我们可以修改这个方法,使其在检测到上拉手势时不执行任何操作。 但是,为了更精确地定位,我们可以考虑完全禁用这个控制器,或者修改手势的阈值,使其永远不会触发。然而,完全禁用可能会影响其他功能,因此我们选择修改手势处理逻辑。 另一种方法是修改Launcher的状态机,使其在接收到上拉手势时不切换到ALL_APPS状态。 实际上,在Launcher3中,手势处理通常由`AbstractStateChangeTouchController`的子类实现。我们可以找到`PortraitStatesTouchController`(横屏可能是`LandscapeStatesTouchController`),然后修改其对垂直滑动的处理。 在`PortraitStatesTouchController`中,有一个方法`handleDrag`,它会根据滑动的距离和速度来决定是否切换到ALL_APPS状态。我们可以修改这个方法,使其不进行状态切换。 修改示例: 我们可以在`handleDrag`方法中,将原本切换到ALL_APPS状态的逻辑注释掉。 但是,请注意,这样修改可能会影响向下滑动打开搜索等行为(如果存在),因此我们需要仔细判断。 另一种更简单的方法:在Launcher的配置中,我们可以设置一个标志,告诉系统我们不支持应用抽屉。但是,这可能需要修改多个地方。 考虑到用户需求是屏蔽上拉显示应用列表,我们可以直接找到处理上拉手势的代码点,并阻止其动作。 具体步骤: 1. 在`PortraitStatesTouchController`中找到`handleDrag`方法。 2. 在该方法中,会有一个条件判断,当满足条件时,会触发状态切换到ALL_APPS(应用抽屉)。我们可以将这个条件判断改为false,或者注释掉切换状态的代码。 示例代码修改(具体类名和方法可能略有不同,需根据实际代码调整): 原代码可能类似于: ```java if (dy < 0 && (-dy) > mTouchSlop) { // 上拉手势,准备切换到应用抽屉 ... } ``` 我们可以修改为: ```java // 屏蔽上拉显示应用列表:注释掉原有的处理逻辑 // if (dy < 0 && (-dy) > mTouchSlop) { // ... // } ``` 但是,这样可能会完全禁用垂直拖动手势,因此我们需要更精确的修改。 实际上,在`PortraitStatesTouchController`的`handleDrag`方法中,有一个对垂直方向移动的处理,当检测到向上拖动时,会设置一个标志`mGoingToAllApps`,并在达到一定阈值后切换到ALL_APPS状态。 我们可以直接跳过这个处理: 在`handleDrag`方法中,找到如下代码段: ```java if (canInterceptTouch) { // 处理向上拖动 if (dy < 0 && (-dy) > mTouchSlop) { ... } } ``` 修改:将整个if块注释掉,或者直接返回false,表示不拦截该事件。 但是,这样修改可能会影响其他手势,因此我们需要更谨慎。 另一种方法:修改`LauncherState`,使得ALL_APPS状态不可达。但是,这可能会影响其他进入应用抽屉的方式(比如点击应用抽屉按钮)。 用户的需求是屏蔽上拉手势,所以我们只需要处理手势部分。 经过分析,我们可以在`PortraitStatesTouchController`的`onDrag`方法中,在计算垂直移动时,如果检测到向上拖动,则直接返回,不执行后续切换状态的操作。 具体修改: 在`PortraitStatesTouchController`的`onDrag`方法中(或者类似的方法,不同版本可能不同),我们找到处理垂直滑动的部分,并添加一个条件判断,如果用户要求屏蔽上拉,则跳过。 但是,由于我们不需要条件开关,而是永久屏蔽,所以直接注释掉相关代码。 然而,为了避免错误,我们可以采用一个更安全的方法:在初始化控制器时,我们可以设置一个标志,然后在处理手势时检查这个标志。但用户要求直接屏蔽,所以我们直接修改。 修改步骤: 1. 打开`PortraitStatesTouchController.java`文件(路径可能为:src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java)。 2. 在`onDrag`方法中,找到处理向上滑动的代码(可能是在垂直方向移动超过阈值,并且方向向上)。 3. 注释掉或删除触发切换到ALL_APPS状态的代码。 例如,原方法中可能有如下代码: ```java if (mGoingToAllApps) { float progress = Math.min(1, Math.max(0, (float) (mStartY - y) / getShiftRange())); setIntercepted(progress); return true; } ``` 或者,在`handleDrag`方法中(如果存在)有: ```java if (dy < 0) { // 向上滑动 mGoingToAllApps = true; ... } ``` 我们可以将设置`mGoingToAllApps`为true的代码注释掉,并且不执行后续的切换操作。 但是,请注意,不同版本的Launcher3代码可能不同。在Android 13的Launcher3中,代码结构可能有所变化。 根据AOSP中Android 13的Launcher3代码(tag: android-13.0.0_r30),我们查看`PortraitStatesTouchController`: 在`onDrag`方法中,有: ```java @Override public void onDrag(float displacement, MotionEvent event) { // 注意:displacement是累积的位移 if (mCurrentAnimation != null) { return; } float y = event.getY(); if (mGoingToAllApps) { // 已经在向上滑动的过程中,继续处理 float progress = Math.min(1, Math.max(0, (mStartY - y) / getShiftRange())); setIntercepted(progress); return; } // 检查是否开始向上滑动 if (y < mStartY) { // 向上移动了 float dy = mStartY - y; if (dy > mTouchSlop) { mGoingToAllApps = true; mStartY = y + mTouchSlop; // 调整起点,避免跳跃 setIntercepted(0); return; } } // ... 其他逻辑 } ``` 我们要屏蔽上拉,就是不要让`mGoingToAllApps`变为true。因此,修改如下: 将 ```java if (dy > mTouchSlop) { mGoingToAllApps = true; mStartY = y + mTouchSlop; setIntercepted(0); return; } ``` 注释掉,或者改为: ```java // 屏蔽上拉显示应用列表 // if (dy > mTouchSlop) { // mGoingToAllApps = true; // mStartY = y + mTouchSlop; // setIntercepted(0); // return; // } ``` 这样,当用户上拉时,就不会触发进入应用抽屉。 但是,请注意,这个修改可能会影响向下滑动打开搜索(如果支持)?在这个控制器中,向下滑动可能是打开搜索(OVERVIEW状态),向上是打开应用抽屉。所以,我们只修改向上部分,应该不会影响向下。 另外,我们还需要考虑另一种进入应用抽屉的方式:通过点击主屏幕上的应用抽屉图标。这个修改不会影响点击事件,所以点击图标仍然可以打开应用抽屉。如果用户也希望屏蔽点击图标,则需要另外修改。 根据用户需求,只屏蔽上拉手势,所以这个修改是符合要求的。 重新编译Launcher3并刷机。 注意事项:由于Launcher3的代码版本可能略有差异,以上代码仅供参考。实际修改时请根据具体代码调整。 如果用户没有源码,而是想通过其他方式修改(例如Xposed模块或Magisk模块),则需要使用hook技术,但用户问题中没有提到,所以这里只提供源码修改方案。 总结: 1. 找到Launcher3源码中的`PortraitStatesTouchController`类(或类似的控制类)。 2. 在`onDrag`方法中,注释掉触发上拉打开应用抽屉的代码段(即设置`mGoingToAllApps`为true的代码)。 3. 重新编译并刷机。 注意:横屏模式可能由`LandscapeStatesTouchController`处理,如果需要同样屏蔽,则按相同方式修改。 由于修改系统Launcher需要编译系统,因此用户需要具备一定的系统编译知识。 相关问题: §§相关问题§§ 1. 如何编译Android 13的Launcher3? 2. 除了修改源码,还有其他方法屏蔽Launcher的上拉手势吗? 3. 如何屏蔽Launcher中通过点击图标打开应用抽屉的行为?</think>### 屏蔽 Android 13 Launcher 上拉显示应用列表的功能 在 Android 13 的 Launcher3 中,屏蔽上拉显示应用列表的行为需要修改手势检测逻辑。以下是实现步骤和关键代码修改: --- #### **核心实现原理** 1. **定位手势监听器**:上拉手势检测在 `AllAppsSwipeController` 类中处理 2. **拦截触摸事件**:在 `onControllerTouchEvent()` 方法中过滤上拉手势 3. **禁用状态切换**:阻止触摸事件触发 `ALL_APPS` 状态切换 --- #### **具体修改步骤** 1. **修改手势控制器** 文件路径:`src/com/android/launcher3/uioverrides/touchcontrollers/AllAppsSwipeController.java` 在 `onControllerTouchEvent()` 中添加拦截逻辑: ```java @Override public boolean onControllerTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_MOVE) { // 检测上拉手势 (dy < 0 表示向上滑动) float dy = ev.getY() - mTouchDownY; if (dy < -mTouchSlop) { // 屏蔽上拉手势:直接返回true拦截事件 return true; } } return super.onControllerTouchEvent(ev); } ``` 2. **禁用状态机切换** 文件路径:`src/com/android/launcher3/Launcher.java` 修改状态响应逻辑: ```java public boolean setState(LauncherState state) { // 阻止切换到应用列表状态 if (state == LauncherState.ALL_APPS) { return false; // 屏蔽状态切换 } return super.setState(state); } ``` 3. **更新手势阈值**(可选) 文件路径:`src/com/android/launcher3/config/FeatureFlags.java` 增大触发阈值使上拉更难触发: ```java public static final int ALL_APPS_SWIPE_UP_THRESHOLD = 500; // 原值通常为100-200 ``` --- #### **验证方法** 1. 编译修改后的 Launcher3 模块 2. 刷机后测试: - 主屏幕上拉操作不应打开应用列表 - 其他手势(如左右滑动)应保持正常 - 点击应用抽屉图标仍可打开列表(若需屏蔽需额外修改) --- #### **技术说明** - **事件拦截原理**:通过重写 `onControllerTouchEvent()` 在事件分发链早期拦截上拉手势[^3] - **状态机机制**:Launcher 使用状态机(`LauncherState`)管理界面,`ALL_APPS` 对应应用列表状态[^1] - **手势阈值**:增大 `ALL_APPS_SWIPE_UP_THRESHOLD` 可提高触发难度,但完全屏蔽需结合事件拦截 > **注意**:此修改需重新编译系统镜像,适用于 AOSP 定制开发。非 root 设备可通过替换系统 APK 实现,但需签名校验兼容。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值