Service相关总结
Service的应用场景,以及和Thread的区别
Service是什么
Service非常重要,可以用于在后台执行耗时逻辑,或者执行某些需要长时间运行的任务,而且不会看到界面。
甚至可以在程序退出的时候,让service仍然存活一段时间。
Service是一种可以在后台执行长时间运行操作而没有用户界面的组件。
注意:
Service和BroadCast都是运行在主线程,所以不能用来做长时间的耗时操作。
Service和Thread的区别
1.定义:
-
Thread是程序执行的最小单元,是分配cpu的基本单位。安卓中的UI线程等都是线程的一种。
-
Service是安卓中的一种特殊机制,service是运行在主线程中的,不能做耗时操作。使用系统进程托管。
服务和子线程以及服务和后台是两个完全不同的概念。安卓的服务指的是不依赖UI界面。
如果一定要在service里面做耗时操作,也要在service里创建子线程。
2.实际开发
在安卓中,线程一般指的是做耗时操作的线程,而主线程是一种特殊的工作线程,负责处理UI的绘制。主线程里不能做耗时操作
service是安卓四大组件之一,一般运行在主线程当中
3.应用场景
当需要执行耗时的网络操作,文件数据的查询,以及其他可能阻塞主线程运行的操作时就要开启子线程来执行。
需要在后台长时间运行并且不需要界面的一些操作,常放在service里执行,比如后台播放音乐,一些数据统计等。
为什么不直接在activity里面创建子线程而要去service里面创建子线程
当activity被销毁后,没有办法获取之前创建的子线程。
service创建子线程,activity就可以放心的销毁,不用担心出现对后台任务无法控制的情况。
Service生命周期方法介绍
onCreate:
1.当Service创建时被调用。如果service已经在运行了,那么不会在调用;
2.可以在其中做一些初始化操作;
onStartCommand:
1.通过startService方法启动service时调用;
2.在onStartCommand方法中,可以执行后台任务,由于service是运行在主线程,所以如果是耗时任务则需要开启子线程来执行;
3.在service完成任务之后,组件需要通过调用stopService来停止service,或者由service调用stopSelf来自我终止;
4.如果返回值为START_STICK是什么意思:
当整个service因为系统内存不足被杀掉之后,一段时间当内存再次空闲的时候,系统会尝试重新创建这个service,一旦重新创建成功之后,又会调用onStartCommand方法,这时候传的intent为null;
onBind:
1.当有组件调用bindService方法与service进行绑定时回调;
2.在onBind方法中,可以返回一个IBinder对象来提供一个接口,供客户端与service通信;
onUnbind:
1.在组件调用onUnbind方法,与service解除绑定时回调;
onDestroy:
1.service停止运行将被销毁时回调;
2.什么时候停止运行:
当通过startService启动service时,需要组件调用stopService或者service自己执行stopSelf方法时停止运行;
当通过bindService启动service是,需要组件调用onUnbind方法来解除绑定。当所有绑定解除时,service停止运行;
3.在onDestroy时,我们应该释放所有资源,包括子线程、注册的监听器和广播接收者等。
开启Service的两种方式和区别
startService
1.定义一个类继承Service;
2.在manifest.xml中配置该service;
3.使用Context的startService(Intent)方法启动该Service;
4.不再使用时,调用stopService(Intent)方法停止该服务;
通过startService启动服务后,服务处于开启状态,而一旦服务启动后,没有手动调用stopService,service会一直运行。这时候如果activity被销毁了,对service的运行也没有影响。
bindService
1.创建BindService服务端,继承自Service并在类中创建一个实现IBinder接口的实例对象,并提供公共方法给客户端调用;
2.从onBind回调方法中返回此binder实例;
3.在客户端中,从onServiceConnected回调方法中接收binder,并使用提供的方法调用绑定服务;
这里客户端指的Activity,服务端指的Service
调用bindService方法启动Service,Service和Activity是一种绑定状态。
提供了Activity和Service交互的接口,允许Activity和Service进行数据交互,发送请求获取结果等操作。甚至Service和Activity在不同的进程中,可以进行进程间通信来传输数据。这些都需要Service绑定到Activity之后才能运行。
多个Activity可以绑定同一个Service,但是绑定全部解绑后,这个服务就会被自动销毁。不需要像startService启动需要手动调用stopService来停止服务。
onServiceConnected 和 onServiceDisConnected方法
onServiceConnected:
与服务端交互的接口方法,绑定服务的时候被回调;
在这个方法获取绑定Service传递过来的IBinder对象,通过这个IBinder对象,实现Activity与Service的交互;
onServiceDisconnected:
当取消绑定的时候被回调,但正常情况下是不会被调用的;
它的调用时机是当Service服务被意外销毁时,例如内存资源不足是这个方法才被自动调用;