概念
有些用时比较长的操作,希望他运行在后台,不耽误当前的操作,比如,网络请求,文件IO操作,大数据的数据库任务,播放音乐。
service在后台运行,不与用户交互
Question
- 1,启动服务后,按Home键,服务是否还在运行 YES
- 2, 启动服务后,退出进程,是否还在运行 NO
- 3, 启动服务, 不用多线程,界面是否会阻塞(ANR) YES
- 4, 服务是个新进程么,服务是个新线程么 ; 服务不是一个新的进程也不是一个新的线程,是当前进程绑定
按启动方式分类
Started Service
- 1,startedService()启动
- 2, 一旦启动,就运行在后台,即便启动它的对象(Activity)都被销毁了,它依然运行在后台
- 3,通常之启动不返回值
- 4,通常网络上传或这下载,操作完成后,自动停止
onStartCommand()
Bound Service
- 1,bindService()来绑定
- 2,提供客户端服务器接口来启动
- 3,发送请求返回值,甚至通过IPC来通信
- 4,一个服务可以被多个调用者绑定,只要有一个绑定者,服务运行,所有绑定者都退出,服务退出,
onBind
按服务性质分类
Local Service
Remote Service
按实现方法分类
Java Service
Native Service
Service 生命周期
BY startService()
onCreate();
onStartCommand();
onDestroy();
BY Bound Service
onCreate()
onBind()
onUnbind()
onDestroy()
创建以及使用StartService服务
- 启动service
1,继承service 实现MyService,在onStrartCommand()中执行操作
2,在mainfest中注册MyService
3,在activity中启动Myservice,startService();
onStartCommand()返回值
- START_STRICKY
- START_NOT_STRICKY
- START_REDELIVER_INTENT
4,关闭service,
- 调用stopService();
- stopSelf();
创建并启动IntentService
IntentService extend Service
- 异步使用
异步处理服务,实际上新开了一个线程:HandlerThread,在线程中发消息,然后接受处理完成后,会清楚线程
必须有构造函数
多了一个 onHandleIntent(Intent arg)方法如果onStartCammand() 方法返回了START_STRICT,那么onHandleIntent()不会执行
绑定及使用BoundService的步骤
Local BoundService
- 继承Service 或者IntentService 类实现自己的服务
- 在AndroidManifest中注册服务
- 绑定服务bindService()
- 取消绑定服务unbindService()
Messenger
AIDL
StartService 与 BoundService 区别
- startService 和启动它的Activity不同生共死,而BoundService和启动它的Activity同生共死
- 如果当前进程关闭,StartActivity消亡
- 如果service已经启动,则不会再次启动,也就是不会再去执行onCreate()方法。 因为ArrayMap放着