谈Android四大组件之Service篇

时间:2021-09-03 20:43:58

Service简介

Service是Android系统中的四大组件之一,它是一种长生命周期的,没有可视化界面,运行于后台的一种服务程序。Service必须在AndroidManifest.xml中声明。Service有自己的生命周期,可以使用startService()启动一个Service或使用bindService()方法绑定一个已经存在的Service。

Service作用

比如我们播放音乐的时候,有可能想边听音乐边干些其他事情,当退出播放音乐的应用,如果不用Service,我们就听不到歌了,所以这时候就得用到Service了。

Service的生命周期

Service的生命周期没有Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方法,当第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法。

Service的启动方法

Service的有两种启动方式:Context.startService()和Context.bindService(),这两种方式对Service生命周期的影响是不同的。
    1.Context.startService()方式启动
      Context.startService()方式的生命周期: 
      启动时,startService –> onCreate() –> onStart()
      停止时,stopService –> onDestroy()

如果调用者直接退出而没有停止Service,则Service 会一直在后台运行
      Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。

如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。

代码如下:

//创建Intent
Intent intent=new Intent();
Intent.setAction(“com.my.action.MY_SERVICE”); //启动Service
startService(intent); //停止一个Servcie
stopService(intent);

2.Context.bindService()方式启动:
      Context.bindService()方式的生命周期:
      绑定时,bindService() -> onCreate() –> onBind()
      调用者退出了,即解绑定时,
      Srevice就会unbindService() –>onUnbind() –> onDestory()

用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起。

调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。

如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。

绑定Service需要三个参数:bindService(intent, conn, Service.BIND_AUTO_CREATE);
      第一个:Intent对象
      第二个:ServiceConnection对象,创建该对象要实现它的onServiceConnected()和 onServiceDisconnected()来监听Service连接和断开消息

//连接对象
ServiceConnection conn = new ServiceConnection() { //连接时调用
public void onServiceConnected(ComponentName name, IBinder service){
Log.i(“Service”, "连接成功");
}
//断开时调用
public void onServiceDisconnected(ComponentName name) {
Log.i(“Service”, “断开连接”);
}
};

第三个:创建Service方法,一般指定绑定的时候自动创建

Service生命周期视图:

谈Android四大组件之Service篇

Service使用需要注意的问题

1.ServiceConnection 的回调方法onServiceDisconnected() 在连接正常关闭的情况下是不会被调用的, 该方法只在Service 被破坏了或者被杀死的时候调用. 例如, 系统资源不足, 要关闭一些Services, 刚好连接绑定的 Service 是被关闭者之一,  这个时候onServiceDisconnected() 就会被调用。

2.如果Service和调用者不是在同一个进程,则不可以在ServiceConnection的回调方法onServiceConnected中将service强制类型转换,在Debug中可以发现onServiceConnected的service的类型为BinderProxy