Service
为什么需要
-
“抓住”线程
设想当一个活动启动一个线程后finish,当再次创建该活动时,其中线程成员已经被赋予新的线程实例,已经执行的线程将变成“游离”状态,此时若想控制此线程,将是一个问题。
将线程建立在service中,当活动需要对线程进行控制的时候,只需与service进行绑定后,调用相关方法即可。即使活动销毁再创建,只要活动在此期间不销毁不停止,活动与service进行重绑定就可对线程进行控制。
-
“共享”线程
设想上面的活动启动了一个线程,该线程的中断需要在其他的活动中进行控制,那么传递这个线程的引用就是一件很繁琐的事情。
将对线程的操作全部都写在service中,谁需要控制其中线程,谁就与service进行绑定即可
什么情况下使用Service
-
执行耗时&&不需要UI&&存在“游离”情况的任务
不存在“游离”情况时(比如一个线程的整个周期被包含在所属活动的整个周期),就使用常规的线程操作即可
耗时既指一段较长的时间,也指一直执行至应用被后台杀死
-
任务的执行控制需要多组件控制
参考“为什么需要”第二点说明
使用步骤
-
创建Service
-
继承Service
-
重写onBind
在绑定时要做的一些事情,返回一个IBinder实例,绑定者就是通过这个来使用Service中的方法。
-
创建类内IBinder公共子类
这里面编写业务方法
-
在Service中创建第三条中子类的成员mXxxxIBinder
-
编写Service构造函数,目的是实例化mXxxxIBinder
-
在onBind中返回mXxxxIBinder
-
-
声明Service
在资源文件中声明
-
<service android:name=".services.LearnService" android:enabled="true"> </service>
-
-
编写业务逻辑
- 在自定义的类内IBinder公共子类中编写
- 在onXxxx中编写
- 只需要在IBinder中执行的业务,其所涉及的变量也定义在IBinder中
-
绑定Service(在需要此service的活动中进行)
-
创建刚才XxxxIBinder类成员:之后调用Service中的方法
-
创建ServiceConnection类成员(实例化时,需要实现连接(连接成功时调用)和断开连接(后台被强制停止或异常时调用)的回调函数):绑定解绑时需要此成员
-
Intent intent = new Intent(this, LearnService.class); bindService(intent,connection,BIND_AUTO_CREATE);//此时会触发onCreated
-
-
启动Service(开启service中线程任务前必须要先启动这个服务)
-
Intent intent = new Intent(this, LearnService.class); startService(intent);
-
如果不启动此活动就执行其中的线程,就会导致线程处于“游离”状态,可以为此时的Service不过是在常规线程外套了层壳而已,并没有起到service的真正作用
-
-
解绑Service
-
目的:节约资源,解绑后,涉及连接的资源会被释放;活动无需再执行有关service中的回调;避免不必要的交互与通信
-
unbindService(connection);
-
解绑不会调用connection中断开连接的回调函数
-
-
终止Service
-
内部终止,在service需要的位置调用stopSelf();
-
外部停止
Intent intent = new Intent(this, LearnService.class); stopService(intent);
-