start方式启动服务:
生命周期:onCreate()-->onStartCommand()-->onDestory()
特点:开启服务后服务与开启者无关,开启者不可以调用服务的方法
bind方式启动服务:
生命周期:onCreate()--》onBind()--》onUnBind()--》onDestory()
特点:开启服务后,服务与开启者同生共死 ,而且开启者还可以调用服务里的方法
AndroidMenifest.xml
文件中配置成私有的,不允许其他应用访问。
android:exported
属性设为 false,表示不允许其他应用程序启动本应用的组件,即便是显式 Intent 也不行(even when using an explicit intent)。
Service 的 onCreate() 可以执行耗时操作吗?
不可以 ,因为四大组件是运行在主线程的。所以不能进行耗时操作。
那么在Service中如何执行耗时操作?
第一想法肯定是new Thread(),还可以使用 AysncTask
或 HandlerThread
来替代 Thread 创建线程。
还有一种有意思的方式就是IntentService。
IntentService继承service。
IntentService
继承于Service
,若 Service 不需要同时处理多个请求,那么使用IntentService
将是最好选择。你只需要重写onHandleIntent()
方法,该方法接收一个回调的 Intent 参数,你可以在方法内进行耗时操作,因为它默认开启了一个子线程,操作执行完成后也无需手动调用stopSelf()
方法,onHandleIntent()
将会自动调用该方法。
使用 IntentService 的要点如下:
- 默认在子线程中处理回传到
onStartCommand()
方法中的 Intent; - 在重写的
onHandleIntent()
方法中处理按时间排序的 Intent 队列,所以不用担心多线程(multi-threading)带来的问题。 - 当所有请求处理完成后,自动停止 Service,无需手动调用
stopSelf()
方法; - 默认实现了
onBind()
方法,并返回 null; - 默认实现了
onStartCommand()
方法,并将回传的 Intent 以序列的形式发送给onHandleIntent()
,您只需重写该方法并处理 Intent 即可。
在Handler中我们处理完每一个命令都会调用stopSelf(int)方法来停止服务:该方法需要来自onStartCommand方法中的启动ID,只有在接收到最新的启动ID时才会停止服务,就是说,我们的IntentService直到命令队列中的所有命令被执行完后才会停止服务。