系统适配说明
如果设备要实现允许在辅助显示设备上启动常规 Android Activity,则:
- [C-1-1] 必须设置
android.software.activities_on_secondary_displays
功能标记。 - [C-1-2] 必须保证 API 兼容性与在主要显示设备上运行的 Activity 的 API 兼容性类似。
- [C-1-3] 如果某个 Activity 在启动新的 Activity 时没有通过
ActivityOptions.setLaunchDisplayId()
API 指定目标显示设备,则必须在前者所在的显示设备上启动后者。 - [C-1-4] 当带有
Display.FLAG_PRIVATE
标记的显示设备被移除后,必须销毁所有 Activity。 - [C-1-5] 如果显示区域的大小发生变化,则必须相应地调整 VirtualDisplay 上所有 Activity 的大小。
- 当文字输入字段成为辅助显示设备上的焦点时,可以在主要显示设备上显示 IME(输入法编辑器,可让用户输入文字的一种用户控件)。
- 如果支持触摸输入或按键输入,则应在独立于主要显示设备的辅助显示设备上实现输入焦点。
- 如果 Activity 是在辅助显示设备上启动的,则应具有与该显示设备对应的
android.content.res.Configuration
,以便能够显示内容、正确操作以及保持兼容性。 - 如果设备实现允许在辅助显示设备上启动常规 Android Activity,并且主要显示设备和辅助显示设备具有不同的
android.util.DisplayMetrics
,则: - [C-2-1] 不得允许在辅助显示设备上启动大小不可调整的 Activity(AndroidManifest.xml 中有 resizeableActivity=false)以及采用 API 23 级或更低级别的应用。
- 如果设备实现允许在辅助显示设备上启动常规 Android Activity,并且辅助显示设备具有 android.view.Display.FLAG_PRIVATE 标记,则:
- [C-3-1] 只有该显示设备的所有者、系统以及已经存在于该显示设备上的 Activity 能够在该显示设备上启动 Activity。每个人都可以在具有 android.view.Display.FLAG_PUBLIC 标记的显示设备上启动 Activity。
添加系统feature
如上面系统适配说明中所述,要实现在辅助显示设备上显示常规的 Android Activity,则必须设置 android.software.activities_on_secondary_displays
功能标记。这是一个feature
标记,配置文件在目录frameworks/native/data/etc
下,内容如下:
<permissions>
<feature name="android.software.activities_on_secondary_displays" />
</permissions>
默认情况下,该配置文件是没有被打包到系统中去的,需要我们修改mk文件来打包到系统中。Android P系统采用PRODUCT_COPY_FILES的方式来增加拷贝项,一般需要添在device目录下对应的设备的PRODUCT_MAKEFILES
文件中进行添加。
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.software.activities_on_secondary_displays.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.activities_on_secondary_displays.xml
代码实现:
private void startSecondDisplay() {
if (mPresentation != null) {
mPresentation.dismiss();
}
Bundle bundle;
MediaRouter mediaRouter = (MediaRouter) getSystemService(Context.MEDIA_ROUTER_SERVICE);
MediaRouter.RouteInfo route = mediaRouter.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_VIDEO);
if (route != null) {
Display presentationDisplay = route.getPresentationDisplay();
Log.d(TAG, "start SecondDisplayActivity presentationDisplay id: " + presentationDisplay.getDisplayId());
bundle = ActivityOptions.makeBasic().setLaunchDisplayId(presentationDisplay.getDisplayId()).toBundle();
Bundle optsBundle = true ? bundle : null;
Intent intent = new Intent(this, SecondDisplayActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent, optsBundle);
}
}
模拟验证
在开发者模式可以打开模拟辅助显示设备(Simulate secondary displays)
选项来打开一个模拟的辅助显示设备。