Android 13屏蔽Activity或包的手势禁止滑动退出

本文介绍了如何在Android设备上禁用某些Activity的左滑或右滑退出功能,通过修改config.xml和EdgeBackGestureHandler.java中的代码,实现对特定Activity的手势拦截。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在Android设备中,左/右滑两次会出现一个箭头然后退出Activity页面,有些Activity页面不想出现箭头及退出.
以下是对项目中的别人已实现的代码解析.

在config.xml中配置要禁用的Activity

packages/apps/Launcher3/quickstep/res/values/config.xml
resources中gesture_blocking_activitiesg添加Activity到item中,此例中为GestureSandboxActivity

<resources>
    <string name="overscroll_plugin_factory_class" translatable="false" />
    <string name="task_overlay_factory_class" translatable="false"/>

    <!-- Activities which block home gesture -->
    <string-array name="gesture_blocking_activities" translatable="false">
        <item>com.android.launcher3/com.android.quickstep.interaction.GestureSandboxActivity</item>
    </string-array>

后面所有代码都在这个java文件中
frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java

config.xml中禁用内容读出来

EdgeBackGestureHandler构造函数中把config.xml中内容读出来,把禁用的Activity读到mGestureBlockingActivities.contains变量中.

    // Activities which should not trigger Back gesture.
    private final List<ComponentName> mGestureBlockingActivities = new ArrayList<>();
    
        ComponentName recentsComponentName = ComponentName.unflattenFromString(
                context.getString(com.android.internal.R.string.config_recentsComponentName));
        if (recentsComponentName != null) {
            String recentsPackageName = recentsComponentName.getPackageName();
            PackageManager manager = context.getPackageManager();
            try {
                Resources resources = manager.getResourcesForApplication(
                        manager.getApplicationInfo(recentsPackageName,
                                PackageManager.MATCH_UNINSTALLED_PACKAGES
                                        | PackageManager.MATCH_DISABLED_COMPONENTS
                                        | PackageManager.GET_SHARED_LIBRARY_FILES));
                int resId = resources.getIdentifier(
                        "gesture_blocking_activities", "array", recentsPackageName);

                if (resId == 0) {
                    Log.e(TAG, "No resource found for gesture-blocking activities");
                } else {
                    String[] gestureBlockingActivities = resources.getStringArray(resId);
                    for (String gestureBlockingActivity : gestureBlockingActivities) {
                        mGestureBlockingActivities.add(
                                ComponentName.unflattenFromString(gestureBlockingActivity));
                    }
                }
            } catch (NameNotFoundException e) {
                Log.e(TAG, "Failed to add gesture blocking activities", e);
            }
        }


函数判断是否要对当前Activity进行手势禁用

isGestureBlockingActivityRunning函数用于判断是否要对当前Activity进行手势禁用.

    private boolean isGestureBlockingActivityRunning() {
        ActivityManager.RunningTaskInfo runningTask =
                ActivityManagerWrapper.getInstance().getRunningTask();
        ComponentName topActivity = runningTask == null ? null : runningTask.topActivity;
        if (topActivity != null) {
            mPackageName = topActivity.getPackageName();
        } else {
            mPackageName = "_UNKNOWN";
        }
        return topActivity != null && mGestureBlockingActivities.contains(topActivity);
    }

监听应用任务变化,判断当前是否要禁用手势

mGestureBlockingActivityRunning为true则要禁用.

    private boolean mGestureBlockingActivityRunning;
    
    
    private TaskStackChangeListener mTaskStackListener = new TaskStackChangeListener() {
        @Override
        public void onTaskStackChanged() {
            mGestureBlockingActivityRunning = isGestureBlockingActivityRunning();
        }
        @Override
        public void onTaskCreated(int taskId, ComponentName componentName) {
            if (componentName != null) {
                mPackageName = componentName.getPackageName();
            } else {
                mPackageName = "_UNKNOWN";
            }
        }

        @Override
        public void onActivityPinned(String packageName, int userId, int taskId, int stackId) {
            mIsInPipMode = true;
        }

        @Override
        public void onActivityUnpinned() {
            mIsInPipMode = false;
        }
    };

禁用

在onMotionEvent函数中,设置mAllowGesture为false就会禁用手势,其中 mGestureBlockingActivityRunning为true时会设置mAllowGesture为false,这个变量赋值后面会提到.

    private void onMotionEvent(MotionEvent ev) {
        int action = ev.getActionMasked();
        if (action == MotionEvent.ACTION_DOWN) {
            if (DEBUG_MISSING_GESTURE) {
                Log.d(DEBUG_MISSING_GESTURE_TAG, "Start gesture: " + ev);
            }

            // Verify if this is in within the touch region and we aren't in immersive mode, and
            // either the bouncer is showing or the notification panel is hidden
            mInputEventReceiver.setBatchingEnabled(false);
            mIsOnLeftEdge = ev.getX() <= mEdgeWidthLeft + mLeftInset;
            mMLResults = 0;
            mLogGesture = false;
            mInRejectedExclusion = false;
            boolean isWithinInsets = isWithinInsets((int) ev.getX(), (int) ev.getY());
            mAllowGesture = !mDisabledForQuickstep && mIsBackGestureAllowed && isWithinInsets
                    && !mGestureBlockingActivityRunning
                    && !QuickStepContract.isBackGestureDisabled(mSysUiFlags)
                    && isWithinTouchRegion((int) ev.getX(), (int) ev.getY());
            if (mAllowGesture) {
                mEdgeBackPlugin.setIsLeftPanel(mIsOnLeftEdge);
                mEdgeBackPlugin.onMotionEvent(ev);
            }

安卓手势导航

安卓手势导航是一种通过手指在手机屏幕上滑动、轻触等手势来进行操作的方式,它在安卓系统中越来越受到用户的欢迎,以下是关于它的详细介绍:

优点

  1. 便捷性:用户可以快速完成常用操作,避免了对实体按键的依赖。
    屏幕空间利用:去除传统的导航栏后,能获得更大的屏幕显示空间,享受更好的视觉体验。
  2. 时尚感:手势操作显得更加现代和时尚,符合当前的科技潮流。

启用方法

不同品牌的安卓手机设置手势导航的方式可能有所差异,但大致步骤相似:

  1. 打开设置:找到并点击手机主屏幕上的 “设置” 图标,进入设置菜单。
    找到 “系统” 选项:在设置菜单中,向下滚动,找到 “系统” 或者 “关于手机” 选项,点击进入。
  2. 选择 “手势” 或 “导航”:在 “系统” 设置中,可能会看到 “手势” 或 “导航” 选项。
  3. 启用手势导航:在手势或导航设置中,选择启用手势导航。部分手机可能会提供不同的手势风格,可以根据个人喜好进行选择。
  4. 学习手势操作:启用手势导航后,系统可能会引导用户学习常用的手势操作,可根据提示进行练习以便熟悉这些手势。

常用手势

  1. 返回:从屏幕的边缘向内滑动。
  2. 主页:从屏幕底部向上滑动并停顿,或者直接快速向上滑动。
  3. 最近任务:从屏幕底部向上滑动并稍微停留,会看到最近使用的应用列表。
  4. 快速切换应用:在显示的最近任务中,左右滑动可以快速切换不同的应用程序。

品牌特性

  1. 华为:用户可以通过 “设置”>“系统”>“手势控制” 进行调整,还能设置自定义手势,如屏幕截图和应用快速启动。
  2. 小米:用户可前往 “设置”>“全屏手势” 进行启用和调整,其手势功能包括长按返回和快速切换应用的便捷操作。
  3. 三星:用户可以在 “设置”>“显示”>“导航条” 中进行设置,三星设备支持多种手势操作,包括快速启动相机等功能。

注意事项

  1. 适应期:初次使用手势导航的用户可能需要一定时间来适应新的操作方式。
  2. 保护膜影响:使用保护膜时要确保其不影响手势的灵敏度,因为手势操作常常涉及到边缘的滑动。
  3. 误操作:在使用手势导航时,尤其是在不平稳的环境中,可能会出现误操作。
    作者:帅得不敢出门 csdn原创谢绝第三方网站转载及收录
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅得不敢出门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值