一、什么是Service
有些用时比较长得操作我们希望他在后台运行 ,不耽误我们当前的操作 。 这就引入了Service概念 。
常见的比如:访问网络 , 文件IO操作 , 大数据的数据库任务,播放音乐等 。
Service在后台运行,不与用户进行交互。在默认情况下,Service运行在应用程序进程的主线程中,如果需要在Service中处理一些网络连接等耗时的操作,那么应该将这些仸务放在单独的线程中处理,避免阻塞用户界面
二、Question
1,启动服务后,按Home键,服务是否还在运行? Yes
2,启动服务后,退出进程,是否服务还会运行? NO
3,启动服务,不用多线程,界面是否会阻塞? Yes
4,服务是个新的进程么,服务是个新的线程么?
.服务不是一个新的进程,也不是一个新的线程 。 与当前进程绑定的
三、Service的分类
按照启动方式分类:
=== < Started Service > ===
1,startService()来启动
2,一旦启动,就运行在后台,即便启动它的对象(Activity)都销毁了
3,通常只启动,不返回值
4,通常网络上传或者下载,操作完成后,自动停止
=== onStartCommand() ===
< Bound Service >
1,bindService()来绑定
2,提供客户端服务器接口来启动
3,发送请求,得到返回值,甚至通过IPC来通讯
4,一个服务可以被多个调用者绑定,只要有一个绑定者,服务运行,所有绑定者都退出,服务退出
onBind()
按服务性质分:Local Service、Remote Service。
(1). 本地服务(Local Service):说白了就是在同一个apk内被调用。
(2). 远程服务(Remote
Sercie):被另外一个apk调用。
按实现方法分类:Java Service、Native Service。
四、生命周期
Service只有在系统资源不足的时候才有可能被系统销毁。值得注意的是:
Service如果正在bind状态,很少会被销毁,如果服务运行在前台,几乎不会被销毁。
五、创建及使用StartedService步骤
创建Service–继承android.app.Service实现自己的服务–必须在AndroidManifest.xml注册service必须在AndroidManifest.xml注册service
启动service–startService(i);
停止service–stopService(i);
1 继承Service类实现自己的服务
2 在AndroidManifest中注册服务
3 启动服务startService()
4停止服务stopService() stopSelf()
onStartCommand() 返回值:
START_STICKY START_NOT_STICKY START_REDELIVER_INTENT
集成Service和IntentService的区别?
所有服务的基类,我们要实现服务就需要继承这个类 。IntentService:
异步处理服务 ,新开了一个线程:HandlerThread
在线程中发消息 ,然后接收
处理完成后 , 会清除线程 ,并且关掉服务 。
六、绑定及使用Boundservice的步骤 <介绍Binder>
Local BoundService
1 继承Service或者IntentService类实现自己的服务
2 在AndroidManifest中注册服务
3 绑定服务bindService()
4 取消绑定服务unbindService()
Messenger
AIDL
【FAQ:思考】
boundService - 绑定(onBind)和连接(onServiceConnected)两个方法谁先执行? onBind
相类似的onUnBind 和 onServiceDisconnected呢? onUnBind
理解清楚了binder的作用么?
七、StartedService & BoundService 区别
两种服务最本质区别 :
boundService 其实是有一个客户端,服务器端的概念。借助于Binder 来通讯。
1,StartedService 和启动它的Activity不同生共死
BoundService 和启动它的Activity同生共死
2,无论是start or bind ,只要service没有实例化,就都会被create 。 但start 每次都会调用onStartCommand 。bind , 则如果已经绑定,就不再调用onBind了 。
八、在前台运行服务
何时会用到前台服务?
有的时候 , 我们不希望后台服务被系统在资源不够用的时候杀死,所以就会把服务设定为前台服务 。
比如音乐播放器,在后台播放的时候,我们就不希望被杀死 。
启动方式:startForground(int , notification)。
九、扩展:Native Service (详见下一章节)
什么是Native Service
何时会用到Native Service
如何调用
十、扩展:Service运行中如何与用户交互
Toast Notification
StatusBar Notification
十一、如何在Service和线程之间选择?
1 Service是一个很方便的组件让你运行后台操作,并且不影响当前操作。
2当你需要在你当前操作的时候另外起一个更独立操作时候可以考虑线程,比如当前程序不关闭的情况下运行音乐。
3从逻辑上你认为需要一个后台操作,但跟我们现在主线程操作通讯频繁,逻辑关系紧密,就用多线程(直接用)。
4能够从逻辑上区分开来,就用后台服务。
十二、FAQ:思考
1>Service是一个新的进程或者新的线程么?
2>startedService 和 boundService区别?
3>activity和service是否在同一个进程和线程中?
默认情况下,这两个组件都在同一个进程中,但是不是同一个线程,activity为前台进程,service是后台进程,当android系统资源紧张的时候davlik虚拟机会首先寻找前台进程进行资源的释放,其次才是一些后台进程,所以通常我们把长时间运行的模