辅助显示上的ActivityView和启动活动

时间:2018-04-03 17:20:31

标签: android android-activity

我试图显示(作为系统级应用程序)多个活动。有一个名为ActivityView的隐藏AOSP类就是为了做到这一点。根据我的理解,您可以在这里使用它:

findViewById(R.id.view1).setCallback(object: ActivityView.StateCallback() {
    override fun onActivityViewReady(view: ActivityView?) {
        view?.startActivity(InnerActivity.getIntent(view.context, "my extra"))
    }

    override fun onActivityViewDestroyed(view: ActivityView?) {
        // Cleanup
    }
})

请注意,必须在属性allowEmbedded设置为true的情况下声明内部活动。这是我的情况。我的应用程序还具有权限android.permission.INJECT_EVENTS(并构建为系统应用程序,带有ROM证书并安装在/system/priv-app

现在,针对这个问题:当我调用startActivity时,内部活动会在堆栈上显示为新活动,就像任何标准Context.startActivity调用一样(ActivityView.startActivity方法实际上确实如此,但在此之前为捆绑添加了一些选项,以在虚拟显示器上显示活动)。我还有一个系统Toast显示,告诉我我的App does not support launch on secondary displays

关于这个Toast,我试图给我的申请android.permission.CAPTURE_SECURE_VIDEO_OUTPUT许可,但没有帮助。

我可能遗漏了与虚拟显示相关的内容,但我看不到...

(我知道ActivityView是隐藏的,实际上可能是一个错误,我只是对它能做什么或不能做什么感到好奇。)

2 个答案:

答案 0 :(得分:3)

我已经在Android 9(Pie)上成功使用ActivityView。我注意到了一些可以参考使用ActivityView的关键点。

  1. 使用ActivityView的应用程序必须是私有应用程序(安装在/ system / priv-app中),并且必须使用系统uid(在AndroidManifest.xml中声明),如下所示

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="your.packagename"
        android:sharedUserId="android.uid.system">
    

    请注意,您需要用应用程序的程序包名称替换“ your.packagename”

  2. 您需要配置Android框架以通过将文件android.software.activities_on_secondary_displays.xml复制到/ system / etc / permissions /

    来支持辅助显示
    • android.software.activities_on_secondary_displays.xml的内容
      <?xml version="1.0" encoding="utf-8"?>
      <permissions>
          <feature name="android.software.activities_on_secondary_displays" />
      </permissions>
      
    • 您应该在makefile中进行配置,以在使用PRODUCT_COPY_FILES从源代码的Android映像构建过程中复制此文件
  3. 启用可调整大小的模式并为Activity使用singleTask需要放置在ActivityView内

    在AndroidManifest.xml

    <activity
        android:name=".YourActivity"
        android:resizeableActivity="true"
        android:launchMode="singleTask">
    

答案 1 :(得分:0)

对于必须允许放置在ActivityView中的任何活动,必须将这两个属性添加到清单中的Activity标记中:

android:resizeableActivity="true"
android:allowEmbedded="true"

如您所知,由于ActivityView并非Android SDK的一部分,因此未进行记录。