Service是Android的四大组件之一,用于长时间驻留在后台进行操作;
他区别于线程,虽然在App中进行创建和绑定的,但是最终是在主线程里运行的。
所以,一些耗时操作,如网络请求,用户输入,音视频播放等,最好是在Service的子线程中进行处理。
服务能被其他应用程序的组件启动,既是用户切换到另外的应用是还能保持后台运行,此外程序组件还能
与服务绑定,并与服务进行交互,甚至能进行进程间通信,所有这些都是后台进行的。
服务有两种基本类型:
Started和Bound
Started是应用程序组件调用startService()来启动服务,一旦启动,服务就能在后台一致运行下去,
既是启动它的组件已经被销毁了。通常,started的服务执行单一的操作并且不会像调用者返回结果。
Bound是通过一个应用程序组件调用BindService()绑定到服务上,则该服务就被bound可,bound服务提供了一个客户端/服务器接口,允许组件与服务进行交互,发送请求,获取结果,甚至可以利用进程间通信跨进程之赐你个操作。
多组件可以同事与一个服务绑定,不过所有的组件解除绑定后,服务也就被销毁。
服务的生命周期图
11111
11111
Service生命周期
Service有两种启动方式,一种是startService();一种是BindService();
第一种生命周期为:onCreate()-》onStart()——》ServiceRunning--》(如果调用context。stopService())
onDestory()---》ServiceShutdown
如果在程序运行期间,又调用StartService(),那么这个时候就不走onCreate()方法,而是直接走onStart()方法
第二种生命周期:onCreate()——》onBind()——》ServiceRunning——》onUnbind()——》onDistory——》ServiceStop
和上面一样,如果运行期间调用了BindService(),那么这个时候会走onBind方法,而不走onCreate();
区别:onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态和其他操作,
这个时候调用者和Service是绑定在一起的,Context退出了,Service就会调用onUnbind()——》ondestory进行退出
也就是说BindService会吧Service和Activity进行绑定,一旦Activity销毁,那么队形的服务也就销毁了,
按HOME不会消失。
代码实现
首先新建一个类Myservice继承Service
public class MyService extends Service { final static String ACTION="com.baozilichao.android"; private SimpleBind binder;
重写方法
onCreate创建服务
onStartConnand启动服务
onDestory销毁服务
onBind绑定服务
onUnbind解除绑定
先在AndroidManifest中注册服务
<service android:name=".MyService"> <!--这个是进行服务启动的时候的过滤的,启动指定的服务--> <intent-filter> <action android:name="com.baozilichao.android"/> </intent-filter> </service>启动服务时,调用方法启动服务
startService(new Intent(MyService.ACTION));
停止服务
stopService(new Intent(MySrevice.ACTION));
绑定服务
首先:Intent intent=new Intent(MyService.ACTION);
声明创建关联的方法;
ServiceConntion sc=new ServiceConntion(){
public void onServiceConnected(ComponentName componentName,IBinder iBinder){
MyService.SimpleBind binder=(MyService.Simple)iBinder;}
在Myservice中自定义方法,这里模拟从服务中获取数据
class SimpleBind extends Binder { public String getString(){ return "已获得来自服务的一个数据"; }在IBinder返回数据
调用方法绑定服务
BindService(intent,sc,BIND_AUTO_CREATE);
完成后绑定成功