logo头像

勤求古训,博采众方

禁止分屏模式的实践

本文于 1112 天之前发表,文中内容可能已经过时。

本文是主要是通过低成本的方法来满足用户需求

了解分屏模式

背景

  • Android7.0中增加了多窗口模式或者叫分屏模式,即屏幕上可以同时显示多个窗口。
  • 在分屏模式下,各个窗口的应用都可以正常运行,但是只能有一个窗口获得焦点,而另外的窗口则属于暂停状态。
  • 默认情况下,Android N 的 Activity 都是开启多窗口模式的。在 Nexus 6P 手机上,分屏模式的启动和退出是长按多任务虚拟按键。
  • Android7.0 用户可以通过以下方式切换到多窗口模式:
    • 用户打开 Overview 屏幕并长按 Activity 标题,可以拖动该 Activity 至屏幕突出显示的区域,使 Activity 进入多窗口模式。
    • 用户长按 Overview 按钮,设备上当前的 Activity 将进入多窗口模式,同时将打开 Overview 屏幕,用户可在该屏幕中选择要共享屏幕的另一个 Activity。

禁止进入分屏

首先需要去看当前系统版本,分为7.0和7.0以下系统

  • 1.如果是7.0系统,如果不想让 Activity 使用多窗口模式,只需要在清单文件中为 Activity 节点设置
    1
    android:resizeableActivity="false"
  • 2.如果是7.0以下则可以通过
  • 2.1在配置清单中设置主Activity
    1
    android:screenOrientation="portrait"
  • 2.2我们可以在应用的Activity的onCreate方法中去添加判断,以禁止分屏模式,思路就是调用activity的isInMultiWindowMode方法去判断是否处在分屏模式下。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import android.content.pm.PackageManager.NameNotFoundException;

    if (isInMultiWindowMode()){undefined
    Context ctx = null;
    try {undefined
    ctx = this.createPackageContext("com.android.systemui",
    Context.CONTEXT_INCLUDE_CODE
    | Context.CONTEXT_IGNORE_SECURITY);
    int stringId = ctx.getResources().getIdentifier(
    "dock_non_resizeble_failed_to_dock_text", "string", ctx.getPackageName());
    String toast = ctx.getResources().getString(stringId);
    Toast.makeText(this, toast, Toast.LENGTH_SHORT).show();
    } catch (NameNotFoundException ex) {undefined
    Log.e(TAG, "[onCreate] NameNotFoundException ", ex);
    }
    finish();
    }
  • 3.终极办法,这种方法一般不考虑,适用于第三方没有源码的apk,我们需要在systemui中去修改。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java

    ///导包
    import android.widget.Toast;
    import android.app.ActivityManager.RunningTaskInfo;


    ///添加如下两个方法

    public String getTopActivityPackageName()
    {
    String topActivityPackageName = null;
    try{
    ActivityManager manager = (ActivityManager)getContext().getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningTaskInfo> list = manager.getRunningTasks(1);
    if(list != null &&!list.isEmpty() &&list.size()!=0&&list.get(0)!=null&&list.get(0).topActivity!=null){
    topActivityPackageName =(list.get(0).topActivity).getPackageName();
    Log.i(TAG, "getTopActivityPackageName = "+ topActivityPackageName);
    }
    }catch(Exception e){
    Log.i(TAG,e.toString());
    }
    return topActivityPackageName;
    }


    private boolean onLongPressRecents() {
    if (mRecents == null || !ActivityManager.supportsMultiWindow(getContext())
    || !mDivider.getView().getSnapAlgorithm().isSplitScreenFeasible()
    || Recents.getConfiguration().isLowRamDevice) {
    return false;
    }
    ///新增判断
    if ("第三方应用的包名".equals(getTopActivityPackageName())) {
    Toast.makeText(getContext(), R.string.dock_non_resizeble_failed_to_dock_text,
    Toast.LENGTH_SHORT).show();
    return false;
    }
    ///}@

    return mStatusBar.toggleSplitScreenMode(MetricsEvent.ACTION_WINDOW_DOCK_LONGPRESS,
    MetricsEvent.ACTION_WINDOW_UNDOCK_LONGPRESS);
    }

参考

Android APP禁止分屏的实现

Android多窗口模式(分屏模式)

Android N7.0多窗口适配开发指导