首先,我很抱歉我的英语不太好:)。
我在开发我的应用程序时遇到了问题。
这是我的解决方案的总体架构方案。
http://i.stack.imgur.com/ooTmE.png
为了快速起见,应用程序必须解码裸代码,但有两种可能的方式:
- 使用外部设备(构造函数提供一个包含 android 服务的 sdk 与设备通信),
- 使用 Zxing 库使用手机摄像头,可以有意地管理它。
我自己的服务的目标是管理一些业务代码并为用户透明地选择工具。
我认为这是一个很好的解决方案,但我想实现它,但我遇到了不同的问题。
我的主要问题是我无法在服务内部执行 StartActivityForResult。
是否有人对我的问题有任何建议,无论是架构更改还是主要问题的解决方案?
@Laurent':您完全正确,我的服务充当 API 适配器。
我会尽量使预期的行为更加清晰。
我有一个应用需要识别顶部有二维码的(真实)物体。在应用程序的生命周期中,用户将多次执行此识别操作。
用户通过点击按钮选择启动识别(或者以其他方式但他知道识别将开始)。因此不需要通知。
问题是他没有选择识别方式。这就是为什么,如您所说,我实现了一个适配器。
适配器选择:
相机移动或外部设备。第一个是来自 Zxing 图书馆的 Activity 。第二个是管理外部设备的服务。该服务提供了一个返回结果的接口(interface)。
还有一件事,我需要我的整个实现(适配器和 co)可以被其他也需要进行识别的应用程序重复使用。
所以我的想法是实现一个服务作为适配器来回答我的两个条件(使用户的选择透明 - 并使其他应用程序可以识别)。
我希望你理解我的问题。
最佳答案
鉴于您的架构,您的 MyOwnService
必须充当 API 适配器:它应该提供统一的扫描 API 并透明地处理每个外部服务的特殊性。
您的预期行为不够明确,无法提供满足您需求的解决方案,但这里有一些评论可能会有所帮助。
被动扫描:
- 即使有一些解决方法:不应从服务启动任何 Activity (不是直接)。绝不。坏的。服务是后台的东西,它们最多被允许使用
Notifications
来提示用户。 (这是贾斯汀出色回答的第 2 点)。
因此,没有什么是“弹出式 Activity ”(这很好!)。如果您需要持续扫描条形码,即使您的 Activity 未运行,那么警告用户的唯一方法是使用状态栏通知。
主动扫描:
- 在您自己的 Activity 中,您可以
绑定(bind)
到您的包装器服务并使其开始扫描代码栏。当它找到一个时,它必须消息
您的 Activity 。您的 Activity消息处理程序
拥有对 UI 的完全访问权限,可以将您的发现通知用户。
您在编辑中选择了主动扫描,因此您的问题是找到一种方法让您的服务主动通知您的主应用程序(开始主动扫描的应用程序) ) 新项目已成功扫描。
你不能通过开始一个新的 Activity 来做到这一点(记住:这是不好的)但是你可以bind
到一个服务和/或在包装服务之间使用Messages
和应用程序。
我建议您花时间阅读(并花更多时间来理解)this android developer article on BoundServices尤其是关于 Messengers
的部分.
可以在以下 android 示例中找到服务和 Activity 之间双向消息传递的完整示例:Service & Activity
警告:设计健壮、成熟的基于 AIDL 的服务是一项艰巨的工作。
关于来自服务的 Android StartActivtyForResult(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7611729/