Activity是Android四大组件之一,主要用于处理没有UI的后台计算任务。
Service特点
- 与调用者在同一进程;
- 运行在主线程,如需进行耗时操作,需要开启线程;
- 多个Activity都可以控制同一个Service,而系统只会创建一个Service。
2种启动方式
1.Start方式
步骤
- 定义一个继承Service的子类
- manifest.xml文件中配置service
- 使用context的startService(Intent)方法启动service
- 不再使用时,调用stopService(Intent)方法停止服务
生命周期
- onCreate() -> onStartCommand() -> onDestory()
- 启动Service:context.startService,如果服务已开启,不调用onCreate, 而是会调用onStart()或者onStartCommand()
- 停止Servcie:context.stopService
特点
一旦服务开启就跟调用者(开启者)没有任何关系了。开启者退出了,开启者挂了,服务还在后台长期的运行,开启者不能调用服务里面的方法。不能的到开启者实例,因此不能与开启者直接交互
2.Bind方式
步骤
- 定义一个继承Service的子类
- manifest.xml文件中配置service
- 使用context的bindService(Intent ,ServiceConnection,int)方法启动service
- 不在使用时,调用unbindService(ServiceConnection) 方法停止服务
生命周期
- onCreate() -> onBind() -> onUnbind() -> onDestory()
- 启动Service:context.bindService,绑定服务不会调用onStart()或者onStartCommand()
- 停止Servcie:context.unbindService
特点
bind的方式开启服务,绑定服务,调用者挂了,服务也会跟着挂掉。绑定者可以调用服务里面的方法。
IntentService
用法
- 定义类继承IntentService的子类,实现父类的onHandleIntent
- 在配置文件注册service
- 启动Service
特点
- 是继承自Service的抽象类。
- 用于处理客户端发送来的startService请求,onIntent每次处理一个startService发送来的请求。
- IntentService会启动一个线程去处理客户端发送来的请求,因此可以处理耗时操作。
- 内部维护了
HandlerThread
,Looper
和Handler
实现,维护了自己的消息队列。 - onHandlerIntent执行完成后,IntentService会尝试自动停止,直到最后一个消息被处理会真正自动停止。
- 拥有较高的优先级,不容易被杀死(待考证)
HandlerThread
- 是一个线程对象,继承了Thread类
- 其内部封装创建好了Looper和MessageQuene
- 通过HandlerThread可以实现UI和子线程的通信
- HandlerThread不需要使用时需要手动回收