我正在尝试开发一个需要服务的应用程序 在后台运行。我对android编程比较陌生, 并阅读了许多帖子,博客,操作方法和创作书籍 和管理服务,我仍然很困惑我的模型 应该尝试使用。
首先,让我(一般)提出申请要求:I 需要一个会产生后台进程的应用程序(服务?) 它将连接到蓝牙设备。蓝牙设备是 旨在将数据传递到Android设备。问题在于 数据可能随时进入,因此蓝牙连接必须 保持活跃。请注意,该应用程序是一个非常具体的应用程序,并且是 不供公众使用。我确实理解不是的论点 让后台应用程序一直运行,但请理解 这是一个非常具体的客户特定应用程序。
现在,总的来说,我认为程序流程将是开始的 应用程序(并启动UI活动)。然后我需要配置和 连接到蓝牙设备。此时,用户应该是 能够做其他事情 - 拨打电话,查看他们的电子邮件等, 虽然蓝牙连接仍然有效且可能 接收数据。如果数据进入,则会触发通知等。
以下是我的问题和疑虑:
如果我启动一个应用程序(它产生一个UI活动,最终产生我的 蓝牙连接服务)但应用程序被杀死,显然, 处理蓝牙连接的服务也被杀死了。怎么能 我还活着吗?我读到Service.setForeground()是 被删除,但即使我将它设置为前景,如果应用程序 被杀,服务也被杀死了。我需要让它运行 尽可能高的优先级背景(再次,我做到了 明白这被认为是“坏形式”,但这是具体的 应用程序和此功能已被客户请求。
如果我启动了应用程序(以及服务等),但是用户说, 接听电话,应用程序进入后台。然而, 假设用户返回主屏幕并启动不同的用户 应用程序的实例,即他没有按住主页键进行选择 任务管理器中已经运行的应用程序,但完全启动 新的一个。如果处理蓝牙连接的服务仍然是 运行,这个新实例将如何表现?也就是说,我怎么才能得到它 连接到FIRST中正在运行的蓝牙服务 应用程序的实例而不是这个新实例?我必须使用吗? 某种形式的远程服务而不是本地服务?这是 我觉得远程服务和东西有点困惑 定义一个AIDL似乎会产生很多额外的开销,从那以后 我已经在服务器中运行了很多开销 背景一直都是,我想保持尽可能小。 我怎样才能确保我连接到已经运行的同一服务?
答案 0 :(得分:4)
1)
该服务不依赖于Activity
。您可以在后台运行它,直到您拨打stopSelf()
。
您可以BroadcastReceiver收听android.intent.action.BOOT_COMPLETED
,以便在手机开机时启动您的服务。
2)
您的Activity
应绑定到该服务。并从中获取信息。
检查this question。