Android模拟器多屏开发实战:车载信息娱乐系统原型验证指南
1. 项目缘起为什么要在Android模拟器里折腾车载多屏最近在做一个车载信息娱乐系统的应用开发其中一个核心需求是支持多屏互动比如中控大屏显示导航地图副驾娱乐屏播放视频后排屏幕还能控制空调。在真机车机上调试这种功能成本高、周期长而且设备并不总是触手可及。于是一个很自然的想法冒了出来能不能用我们最熟悉的开发工具——Android Studio自带的模拟器AVD——来模拟这种多屏环境呢答案是肯定的而且这远比想象中要实用。Android系统本身从很早就支持多屏显示Multi-display特性只是我们日常在手机App开发中很少触及。通过配置Android虚拟设备AVD我们可以轻松创建出多个虚拟显示器并在其上启动不同的Activity从而在本地开发机上构建一个完整的、可交互的车载多屏模拟环境。这不仅能极大提升开发调试效率还能在架构设计阶段就验证多屏交互的逻辑是否合理。对于从事车载应用、平板分屏应用甚至未来折叠屏应用开发的工程师来说掌握这项技能是很有价值的。2. 环境准备创建支持多屏的Android虚拟设备工欲善其事必先利其器。我们的“器”就是Android Studio和其中的AVD Manager。这里的关键不是创建一个普通的手机模拟器而是一个支持多显示器且性能足够的设备。2.1 选择与配置虚拟设备首先打开AVD Manager点击“Create Virtual Device”。在硬件选择页面我强烈建议不要直接选用Phone类别下的预设因为它们对多屏的支持可能不完整。更稳妥的做法是选择“Tablet”或“Automotive”类别例如选择“Tablet”下的“Pixel C”或者“Automotive”下的“Generic Automotive”。这些设备的系统镜像通常对多显示器的支持更好。以“Pixel C”为例它本身就是一个大屏设备系统对多窗口、多活动的管理逻辑更接近车机。选择系统镜像务必选择一个足够新的API Level。Android对多显示器完整、稳定的API支持是从Android 10API 29开始的尤其是Presentation类和DisplayManager的接口趋于稳定。因此建议选择API 29Android 10或更高版本的镜像最好选择带有“Google Play”或“Google APIs”的版本以确保系统服务齐全。完成配置并启动为AVD命名例如Car_Infotainment_MultiScreen完成其他配置如内存、存储空间建议内存给到4GB以上后先启动这个主模拟器。确保它能正常开机进入桌面。2.2 为虚拟设备添加额外显示器主模拟器运行后模拟器窗口的侧边工具栏会有一个名为“…”三个点的按钮点击它打开“Extended controls”面板。进入“Displays”选项卡在这里你可以管理虚拟设备的显示器。添加新显示器点击“Add”按钮。你可以添加多个。对于车载场景我们可以模拟Display 1 (主屏)分辨率设为 1920x720模拟长条形中控屏密度设为mdpi或hdpi。Display 2 (副驾屏)分辨率设为 1280x800模拟副驾娱乐屏密度设为hdpi。Display 3 (后排屏)分辨率设为 800x480模拟后排小控制屏密度设为ldpi。应用设置每次修改后点击“Apply Changes”。此时模拟器屏幕上可能会弹出新的窗口代表附加的显示器。你可以拖动它们到合适的位置。注意模拟器的附加显示器在系统重启后可能会消失需要重新添加。建议将最终确定的多屏配置保存为AVD快照Snapshot下次启动时直接从快照恢复省去重复配置的麻烦。3. 核心原理Android如何管理与使用多显示器在代码层面操作多屏我们需要理解几个核心概念。这不仅仅是调用API更是理解Android窗口系统的设计哲学。3.1 Display, DisplayManager 与 ContextDisplay代表一个物理或虚拟的显示设备对象。它包含了显示器的尺寸、分辨率、刷新率、唯一ID等信息。每个Display都有一个唯一的displayId。DisplayManager是系统服务负责管理所有连接的显示器。我们可以通过(DisplayManager) getSystemService(Context.DISPLAY_SERVICE)获取它的实例然后监听显示器连接/断开事件或者获取当前所有Display的列表。Context与Display这是关键点。在Android中UI组件如Activity、Dialog、View的绘制和行为与其所在的Context紧密相关而这个Context又与一个特定的Display绑定。默认情况下应用组件运行在“默认显示器”通常是主屏上。要让一个Activity在副屏上显示我们必须为其创建一个与目标Display关联的Context。3.2 Activity 在多屏环境下的启动模式这是实现车载多屏应用架构的核心。我们通常不希望副屏的Activity和主屏的Activity混在同一个任务栈Task里。Android为此提供了ActivityOptions来指定启动目标。// 假设我们已通过DisplayManager获取到副屏的Display对象secondaryDisplay val options ActivityOptions.makeBasic() options.launchDisplayId secondaryDisplay.displayId // 关键指定目标显示器ID val intent Intent(this, PassengerVideoActivity::class.java) intent.flags Intent.FLAG_ACTIVITY_NEW_TASK // 通常需要新任务 startActivity(intent, options.toBundle())通过设置launchDisplayId系统会尝试在指定的显示器上寻找或创建一个新的任务栈来容纳这个Activity。这对于车载场景至关重要导航、音乐、车辆设置应该是在不同屏幕上的独立应用模块互不干扰。3.3 Presentation 类专为副屏UI设计如果你只需要在副屏上显示一个简单的、非全屏的UI比如一个播放控件面板、一个空调快捷设置卡片使用Presentation类比启动一个完整的Activity更轻量。Presentation继承自Dialog但它会强制将其Context与一个特定的Display绑定。它的UI布局会完全在该显示器上渲染。class ClimateControlPresentation(context: Context, display: Display) : Presentation(context, display) { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.presentation_climate) // 这是一个简单的布局 // 初始化控件例如温度加减按钮 findViewByIdButton(R.id.btn_temp_up).setOnClickListener { // 发送指令给车辆空调服务 } } } // 在主机Activity中创建并显示 val climateDisplay // ... 获取后排屏幕的Display val presentation ClimateControlPresentation(this, climateDisplay) presentation.show()Presentation的生命周期与其关联的显示器相关。当显示器断开时Presentation会自动dismiss。它非常适合用来实现那些依附于特定屏幕的、非核心的交互控件。4. 实战演练构建一个简易车载多屏Demo理论说得再多不如动手一试。我们来构建一个包含三个屏幕的简易车载信息娱乐系统Demo。4.1 项目结构与权限配置创建一个新的Android项目选择“Empty Activity”。在AndroidManifest.xml中我们需要声明一些权限和特性uses-permission android:nameandroid.permission.SYSTEM_ALERT_WINDOW / !-- 如果需要在不同屏幕的Activity间通信可能需要这个权限 -- uses-feature android:nameandroid.hardware.type.automotive android:requiredfalse / uses-feature android:nameandroid.software.activities_on_secondary_displays /最重要的是主Activity中控屏需要处理多显示器逻辑因此可以将其launchMode设为singleTask以便于管理。4.2 主屏中控Activity显示与控制中心主屏Activity (MainControlActivity) 承担着管理者的角色。它在onCreate中需要做几件事获取DisplayManager并监听显示器变化class MainControlActivity : AppCompatActivity() { private lateinit var displayManager: DisplayManager private val displayListener object : DisplayManager.DisplayListener { override fun onDisplayAdded(displayId: Int) { /* 新屏幕连接启动对应App */ } override fun onDisplayRemoved(displayId: Int) { /* 屏幕断开清理资源 */ } override fun onDisplayChanged(displayId: Int) { /* 屏幕属性变化 */ } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main_control) displayManager getSystemService(Context.DISPLAY_SERVICE) as DisplayManager displayManager.registerDisplayListener(displayListener, null) // 启动时检查现有显示器并初始化 initDisplays() } private fun initDisplays() { val displays displayManager.displays for (display in displays) { when (display.displayId) { Display.DEFAULT_DISPLAY - { /* 这是主屏忽略或更新UI */ } else - launchAppForDisplay(display) } } } private fun launchAppForDisplay(display: Display) { // 这里可以根据Display的物理属性尺寸、分辨率决定启动什么应用 // 例如宽屏可能是副驾启动视频App小方屏可能是后排启动空调控制 val intent when { display.width display.height display.displayId ! Display.DEFAULT_DISPLAY - { // 认为是宽屏副驾娱乐屏 Intent(this, PassengerVideoActivity::class.java) } display.width 1000 - { // 认为是小尺寸后排屏 // 这里我们选择用Presentation showClimatePresentation(display) null } else - null } intent?.let { val options ActivityOptions.makeBasic().apply { launchDisplayId display.displayId } startActivity(it, options.toBundle()) } } private fun showClimatePresentation(display: Display) { // 创建并显示Presentation val presentation ClimateControlPresentation(this, display) presentation.show() // 需要保存引用防止被GC并在屏幕断开时dismiss } }布局设计主屏布局可以包含车辆状态概览车速、续航、导航快捷入口、音乐播放控件以及一个“屏幕管理”区域显示已连接屏幕的状态并提供手动启动应用的按钮。4.3 副驾屏Activity视频播放与独立交互副驾屏的Activity (PassengerVideoActivity) 是一个功能相对独立的应用。它需要处理媒体播放、触摸交互并且最关键的是它不应该能返回到主屏的任务栈。class PassengerVideoActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 关键设置一个不同于主屏的视觉主题强化独立性 setTheme(R.style.Theme_PassengerScreen) setContentView(R.layout.activity_passenger_video) // 初始化ExoPlayer等视频播放组件 initVideoPlayer() // 此Activity应拥有自己的导航栈按返回键直接退出而不是回到主屏 } override fun onBackPressed() { // 直接finish而不是向上导航 finish() } }在它的AndroidManifest.xml中可以为其单独配置一个taskAffinity确保它运行在独立的任务中。4.4 跨屏通信如何让屏幕间“对话”中控屏调整了空调温度如何实时同步到后排的Presentation上这里有几种常见模式ViewModel 共享数据源如果所有组件都在同一个进程内默认如此可以使用一个全局的、生命周期感知的ViewModel通过Application作用域获取或者LiveData/Flow来共享状态。主屏修改温度LiveData后排屏的Presentation观察该LiveData并更新UI。Broadcast使用LocalBroadcastManager已废弃可用LiveData替代或带权限的全局广播进行轻量通信。适合简单的指令传递。Service创建一个后台服务如ClimateControlService来管理空调状态。所有屏幕组件都绑定到这个服务通过AIDL接口或LiveData回调来获取和设置状态。这是更解耦、更接近真实车机架构的做法。// 方式1使用Application作用域的ViewModel class SharedClimateViewModel : ViewModel() { private val _temperature MutableLiveData(22) val temperature: LiveDataInt _temperature fun setTemp(newTemp: Int) { _temperature.value newTemp } } // 在Application类中持有 class MyApp : Application() { val climateViewModel: SharedClimateViewModel by lazy { SharedClimateViewModel() } } // 在主屏和Presentation中获取并观察 val viewModel (applicationContext as MyApp).climateViewModel viewModel.temperature.observe(this) { temp - updateTemperatureUI(temp) }5. 调试技巧与常见问题排查在模拟器多屏环境下开发调试有其特殊性。掌握这些技巧能事半功倍。5.1 使用ADB命令辅助调试Android Debug Bridge (ADB) 是强大的命令行工具在多屏调试中尤其有用。查看所有显示器信息adb shell dumpsys display这条命令会输出所有显示器的详细信息包括displayId、名称、尺寸、状态等。这是确认你的虚拟显示器是否被系统正确识别的第一步。将Activity启动到特定显示器用于快速测试adb shell am start --display display_id -n com.your.package/.YourActivity模拟显示器热插拔在AVD的Extended controls里直接添加或移除显示器然后在Logcat中过滤DisplayManager相关的日志观察你的应用是否正确响应了onDisplayAdded和onDisplayRemoved事件。5.2 常见坑点与解决方案Activity在错误屏幕启动或崩溃问题指定了launchDisplayId但Activity仍然在主屏启动或者直接崩溃报错“Unable to add window”。排查首先用adb shell dumpsys display确认你使用的displayId是真实存在的、并且状态是ON。检查目标Activity是否在AndroidManifest.xml中设置了android:resizeableActivity”true”对于支持分屏/多窗口的设备这个属性有时会影响多屏启动。确保启动Intent添加了Intent.FLAG_ACTIVITY_NEW_TASK标志。在多显示器场景下这通常是必须的。崩溃“Unable to add window”通常是因为传递给Presentation构造函数的Context不是WindowContext或者与目标Display不兼容。确保使用Activity作为Context或者使用createDisplayContext()方法创建与显示器绑定的Context。// 正确做法 val displayContext createDisplayContext(targetDisplay) val presentation MyPresentation(displayContext, targetDisplay)副屏UI渲染异常黑屏、错位问题副屏上的Activity或Presentation能启动但内容不显示或显示异常。排查检查副屏Activity的布局文件是否使用了硬编码的尺寸务必使用match_parent、wrap_content或ConstraintLayout等弹性布局以适应不同分辨率的屏幕。在副屏Activity的onCreate中打印出resources.displayMetrics和windowManager.defaultDisplay的信息确认它获取到的屏幕参数是否正确。对于Presentation确保在show()之后才进行UI操作。它的onCreate时机与Dialog类似。多屏间状态同步失败问题一个屏幕上的操作另一个屏幕没有反应。排查确认你选择的通信方式如LiveData的观察者是否被正确注册和触发。在Presentation或副屏Activity的onCreate/onStart生命周期中注册观察者在onStop或onDestroy中移除。如果使用Service检查绑定bindService是否成功AIDL接口调用是否有权限问题。使用Logcat进行调试在每个关键状态变更处打上日志观察事件流是否按预期传递。5.3 性能考量与模拟器优化在模拟器上运行多个屏幕和Activity对宿主电脑的资源消耗较大。给AVD分配足够资源在AVD配置中将RAM设置为4096MB或更高将VM Heap设置为1024MB。如果电脑性能允许可以开启“使用主机GPU”选项hw.gpu.modehost以加速图形渲染。使用x86系统镜像如果开发机是Intel/AMD CPU务必使用x86或x86_64架构的系统镜像其运行效率远高于ARM镜像通过二进制转换HAXM运行。关闭不必要的模拟器如果同时运行多个AVD实例来模拟多屏资源消耗会成倍增长。优先使用单个AVD的多显示器功能这比运行多个AVD实例要高效得多。6. 从模拟到实车思维模式的转变在模拟器上跑通只是第一步。真实的车载环境要复杂得多。硬件的异构性真实车机的屏幕尺寸、分辨率、像素密度DPI千差万别触摸屏的精度和响应速度也不同。模拟器可以配置参数但真机测试必不可少。需要建立一套完善的屏幕适配方案。系统定制的深度车机系统往往是OEM深度定制的Android可能修改了显示服务、窗口管理器甚至Activity启动逻辑。你的多屏代码在AOSP模拟器上运行正常在实车上可能会遇到兼容性问题。需要与系统供应商紧密沟通获取他们的多屏开发规范或SDK。安全与稳定性要求车载应用属于功能安全相关领域。副屏的视频播放不能影响主屏的导航渲染和触控响应。需要关注进程优先级、内存管理避免出现ANR或崩溃。多屏间的通信也需要考虑安全机制防止恶意应用干扰。输入源的多样性车机上不仅有触摸还有旋钮、实体按键、语音指令。你的副屏Activity需要能响应这些输入方式而不仅仅是触摸。因此Android自带模拟器的多屏功能是一个无价的快速原型验证和早期开发调试工具。它让你能以极低的成本在开发早期就构建出多屏交互的骨架验证核心架构的可行性。但最终的测试、优化和适配必须在目标硬件和真实的车载系统上进行。将模拟器作为你车载多屏开发的第一块试验田它能帮你提前发现和解决大量逻辑层面的问题让后续的真机调试更加有的放矢。

相关新闻

基于YOLO与PyQt5的智能养殖目标检测系统全流程实战

基于YOLO与PyQt5的智能养殖目标检测系统全流程实战

1. 项目缘起:从“猪脸识别”到智能养殖的落地实践 几年前,我在一个农业科技展上,看到有团队在演示一个“猪脸识别”系统,当时觉得既新奇又有点“大材小用”——用深度学习去认猪?但随着深入了解规模化养殖场的实际痛点…

2026/8/7 4:15:26 阅读更多 →
OpenClaw AI智能体云部署与钉钉集成实战指南

OpenClaw AI智能体云部署与钉钉集成实战指南

1. 项目概述:为什么OpenClaw值得你投入时间? 最近在AI智能体这个圈子里,OpenClaw这个名字出现的频率越来越高。如果你也像我一样,对如何让AI不只是聊天,而是能真正“动手”帮你处理工作流、连接各种应用感兴趣&#x…

2026/8/7 4:15:26 阅读更多 →
揭秘江门网站建设费用:从几千到几万到底差在哪?老板们必看干货

揭秘江门网站建设费用:从几千到几万到底差在哪?老板们必看干货

各位在江门做生意的老板们,大家好。今天咱们不聊虚的,也不整那些高大上但听不懂的黑话,就坐下来喝杯凉茶,实实在在地聊聊大家最头疼的一个问题:江门网站建设费用。说实话,每次跟客户聊天,只要话题一转到“做网站多少钱”,空气往往就安静了三秒钟。为什么?因为这个问题…

2026/8/7 4:15:26 阅读更多 →

最新新闻

现代DirectX 11开发指南:从Windows SDK到项目实战

现代DirectX 11开发指南:从Windows SDK到项目实战

1. 项目概述:为什么是DirectX11-With-Windows-SDK?如果你是一名C游戏开发者,尤其是从OpenGL或者更早期的DirectX版本转过来,第一次接触现代DirectX 11开发时,大概率会被各种“SDK”搞晕。是去下载那个传说中的“Direct…

2026/8/7 6:54:01 阅读更多 →
React render函数中的条件判断:if/else的正确使用方式与替代方案

React render函数中的条件判断:if/else的正确使用方式与替代方案

一、问题引入:render函数中的条件判断困惑 1.1 场景描述 在实际的React开发中,我们经常需要根据某些状态或属性来决定渲染什么内容。例如,根据用户是否登录显示不同的界面,根据数据加载状态显示加载动画或内容。此时,许多初学者会本能地想要在render函数的JSX中直接…

2026/8/7 6:54:01 阅读更多 →
角色扮演AI项目部署指南:从大语言模型到本地WebUI与API集成

角色扮演AI项目部署指南:从大语言模型到本地WebUI与API集成

这次我们来看一个名为“血C!陈明峻定序王子外搂诡术师,华仔仔要哭了”的项目。从标题看,这很可能是一个涉及角色扮演、剧情生成或特定社群文化梗的AI应用或工具。这类项目通常聚焦于利用AI模型(如大语言模型或角色扮演模型)来生成…

2026/8/7 6:54:01 阅读更多 →
数据仓库核心架构、治理与实战:从Inmon范式到湖仓一体

数据仓库核心架构、治理与实战:从Inmon范式到湖仓一体

1. 项目概述:从历史节点到技术脉络的深度串联今天这个日子,在科技史上留下了几个深刻的印记。1969年7月20日,阿波罗11号登月舱“鹰”成功着陆月球静海,阿姆斯特朗那句“这是我个人的一小步,却是人类的一大步”响彻寰宇…

2026/8/7 6:54:01 阅读更多 →
“装闭”,让装修套路“装”不下去

“装闭”,让装修套路“装”不下去

愿每个业主在装修路上心中有数,于是,「装闭」来了。 装修行业的水有点儿深 很多人装修完回头看,都发现自己花了不少冤枉钱。设计师画的效果图美轮美奂——复杂吊顶、满墙背景墙、开放格书架……装好以后才发现,这些东西费钱不说&…

2026/8/7 6:54:01 阅读更多 →
Electron菜单与托盘开发实战:跨平台桌面应用的核心交互

Electron菜单与托盘开发实战:跨平台桌面应用的核心交互

1. 项目缘起:为什么Electron的菜单与托盘值得单独拎出来讲?最近在折腾一个跨平台的桌面小工具,用Electron做的。项目做到一半,我发现一个挺有意思的现象:很多开发者,包括我自己一开始,对Electro…

2026/8/7 6:53:00 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →