我试图显示(作为系统级应用程序)多个活动。有一个名为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
是隐藏的,实际上可能是一个错误,我只是对它能做什么或不能做什么感到好奇。)
答案 0 :(得分:3)
我已经在Android 9(Pie)上成功使用ActivityView。我注意到了一些可以参考使用ActivityView的关键点。
使用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”
您需要配置Android框架以通过将文件android.software.activities_on_secondary_displays.xml复制到/ system / etc / permissions /
来支持辅助显示<?xml version="1.0" encoding="utf-8"?> <permissions> <feature name="android.software.activities_on_secondary_displays" /> </permissions>
启用可调整大小的模式并为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的一部分,因此未进行记录。