望远山,知近路,而后自得其乐!

辅助显示设备上显示Activity

系统适配说明

如果设备要实现允许在辅助显示设备上启动常规 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)选项来打开一个模拟的辅助显示设备。

参考:

Android 9 兼容性定义-3.2.4. 辅助显示设备上的 Activity

文章评论已关闭!