Service 服务
Serivce Tip : 四大组件之一 , 后台, 耗时操作
服务是基于android 提供的四大组件之一,地位也是相当之高,主要作为activity不显示的情况,做一些后台的操作,播放音乐,后台下载以及一些其他的耗时操作.
构造Service
Service 一般都是构造一个类去继承Serice
public class MyService extends Service {
Service 一样有属于它的生命周期,有
@Override
public void onCreate() {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
@Override
public void onDestroy() {
至于详细的启动顺序,我们可以在启动模式这块来分别介绍.不过不要忘记了,四大组件都是需要注册的,无论是XML里面还是在代码里面动态注册,这些都是必要的,否则启动不了服务,会很伤脑经的,因为服务未注册,有时候可不会报异常的.
<!--注册service-->
<service android:name=".service.MyService">
两种启动方式
- startservice
常用的服务启动方式, 可以使用intent 进行服务的启动,就像这个样子
intent_start = new Intent(this, MyService.class);
startService(intent_start);
这种通过activity 发Intent 启动服务,当activity销毁后,服务作为独立的进程会继续在后台工作,想想如果activity销毁了,播放的音乐会停止,这肯定不能接受的,当然,部分音乐类App(网易云音乐等)会使用前台Service的工作模式,这个以后在项目里面可以去看下.
当然,Myservice肯定会给予相应的回应,也就是执行Service 的生命周期了
04-30 22:53:11.809 com.brulser.androidbase D/yaoshun: startService
04-30 22:53:11.809 com.brulser.androidbase D/yaoshun: MyService oncreate
04-30 22:53:11.809 com.brulser.androidbase D/yaoshun: MyService onstart
当再次进行启动服务时候,activity就不会再次执行Oncreate
04-30 23:09:27.089 com.brulser.androidbase D/yaoshun: startService
04-30 23:09:27.099 com.brulser.androidbase D/yaoshun: MyService oncreate
04-30 23:09:27.099 com.brulser.androidbase D/yaoshun: MyService onstart
--这里再次执行Intent调用服务
04-30 23:09:29.289 com.brulser.androidbase D/yaoshun: startService
04-30 23:09:29.299 com.brulser.androidbase D/yaoshun: MyService onstart
至于如何去关闭服务,可以用过activity 使用
stopService(intent_start);
//至于得到的回调,当然是
04-30 23:09:25.709 com.brulser.androidbase D/yaoshun: MyService onDestroy
值得一提的是 Service 里面StopSelf()也可以终止服务,但是它会等待onStartCommand 里面的操作处理完成之后,该服务才会进行关闭,但是不会被回收,
- bindservece
通过bindService 开启的服务是伴随着activity的生命进行的,当activity结束之后,该服务就必须得终止.同样,它也是可以通过Intent 启动
intent_bind = new Intent(this, MyService.class);
bindService(intent_bind, connection, BIND_AUTO_CREATE);
通过开启绑定服务,就可以得到android 给予的不一样的回复,可以通过回调看出来
//这块是服务里面的回调
@Nullable
@Override
public IBinder onBind(Intent intent) {
LogUtils.d(Tag + " Onbind ");
return mybind;
}
@Override
public boolean onUnbind(Intent intent) {
LogUtils.d(Tag + " onUnbind ");
return super.onUnbind(intent);
}
//控制台
04-30 23:24:08.009 com.brulser.androidbase D/yaoshun: MyService Onbind
当activity绑定成功之后,Onbind 便提供 onbind 回调,return 一个Ibinder对象,
这个Ibinder 接口就有点复杂了,涉及到android 的IPC机制–进程间通信 相关方面的知识,这里不细说,我们可以通过构造一个对象来尝试一下,
class Mybind extends Binder {
public MyService getService() {
return MyService.this;
}
}
public void OnSericeSysout(String msg) {
LogUtils.d("OnSericeSysout " + msg);
}
这个binder本身是实现了IBinder的实现类,所以我们构造一个Mybinder对象Return 就行了,至于在activity里面,Bind方式启动Service 本身就需要构造一个ServiceConnection,同样也是构造一个就行了
class MyServiceConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
MyService service = ((MyService.Mybind) iBinder).getService();
LogUtils.d("MyServiceConnection onServiceConnected 绑定service成功 ");
service.OnSericeSysout("已经连接上绑定上service");
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
LogUtils.d("MyServiceConnection onServiceDisconnected service 解绑");
}
}
IBinder通过转型,可以转换为我们创建的Mybind内部类,这时候通过调用Myservice里面的方法来验证一下我们是否成功的完成服务和act界面的通信.这里我们可以来通过控制台的返回来看一下.
04-30 23:37:48.739 com.brulser.androidbase D/yaoshun: MyService oncreate
04-30 23:37:48.739 com.brulser.androidbase D/yaoshun: MyService Onbind
04-30 23:37:48.749 com.brulser.androidbase D/yaoshun: MyServiceConnection onServiceConnected 绑定service成功
04-30 23:37:48.749 com.brulser.androidbase D/yaoshun: OnSericeSysout 已经连接上绑定上service
04-30 23:37:50.159 com.brulser.androidbase D/yaoshun: MyService onUnbind
04-30 23:37:50.159 com.brulser.androidbase D/yaoshun: MyService onDestroy
这就是完整的绑定服务生命周期,也在activity 里面成功的转型,控制台打印出了activity 调用service里面的方法,很明显,这时候通过Myserivce对象,操作里面的内容就很容易了.