服务类的目的是什么?
许多蓝牙低功耗示例使用服务类进行所有蓝牙通信、连接、断开连接、扫描设备等。活动类总是从这个服务类调用方法。
直接在 Activity 类中实现所有蓝牙通信怎么样?为什么没有人这样实现并使用服务类来代替?
服务类的目的是什么?
许多蓝牙低功耗示例使用服务类进行所有蓝牙通信、连接、断开连接、扫描设备等。活动类总是从这个服务类调用方法。
直接在 Activity 类中实现所有蓝牙通信怎么样?为什么没有人这样实现并使用服务类来代替?
从文档中:
Service 是一个应用程序组件,可以在后台执行长时间运行的操作,并且不提供用户界面。另一个应用程序组件可以启动一个服务,即使用户切换到另一个应用程序,它也会继续在后台运行。此外,组件可以绑定到服务以与其交互,甚至执行进程间通信 (IPC)。例如,服务可能会在后台处理网络事务、播放音乐、执行文件 I/O 或与内容提供者交互。
基本上,它是一个松散耦合的组件,独立于活动生命周期。问题是在 Android 中,您无法真正控制何时创建/销毁 Activity,因此例如,如果您在 Activity 中加载某些内容并且收到呼叫,则您的 Activity 可能会被销毁,并且更新的结果将是丢失,甚至最糟糕的是,您的加载任务将无法完成并保留该活动,并且它不能被垃圾收集并且您会造成内存泄漏。
因此,您将服务用于长时间运行的后台任务,但只要您必须让它们运行,就可以再次避免内存泄漏并善待您的资源。
警告:您的应用程序在完成工作后停止其服务非常重要,以避免浪费系统资源和消耗电池电量。如有必要,其他组件可以通过调用 stopService() 来停止服务。即使您为服务启用绑定,如果该服务收到对 onStartCommand() 的调用,您也必须始终自行停止该服务。
直接在 Activity 类中实现所有蓝牙通信怎么样?
你很可能会因为在 UI 线程上做太多事情而被框架杀死(又名 ANR - 应用程序无响应)。请参阅开发者网站上的保持您的应用响应文章。
任何与 UI 不直接相关的东西(比如任何类型的网络)都应该卸载到单独的任务中。无论是AsyncTask:
此类允许在 UI 线程上执行后台操作并发布结果,而无需操作线程和/或处理程序。
IntentService 是按需处理异步请求(表示为 Intent)的服务的基类。
. 服务(不是 IntentService)的目的略有不同:
服务是一个应用程序组件,它代表应用程序希望在不与用户交互的情况下执行更长时间运行的操作,或提供功能供其他应用程序使用。
服务类用于执行后台非 UI 操作,例如播放音频文件。进一步的服务是即使您的活动被破坏也会在后台运行的组件,在使用蓝牙时,我们确实做了一些非 UI 电话级别的操作,因此我们使用服务.
活动课不是任何类型的交流任务的好地方。一旦用户切换到另一个活动,它就可以被杀死。它显示了 UI,这意味着我们不能在 Activity 的线程中做很多工作。有时你可以使用类似的东西
Thread t = new Thread(new Runnable() {
@Override
public void run() {
// do something here
}
});
t.start();
使用 AsyncTask 或更复杂的事情,但这适用于短时间的操作。
服务不会这么快被杀死,所以它对任何类型的后台工作都有好处。只需阅读有关服务的 Android 文档。