禁止分屏模式的实践
本文于 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
17import 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
43packages/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);
}