Service是android四大组件之一,服务Service是没有与用户交互界面,在后台运行的操作.
一般用来在后台处理比较耗时的操作,比如网络操作,媒体播放,I/O操作,和ContentProvider交互等,但是Service默认还是在主线程中,除非新建一个线程在其中执行Service
需要在Manifest.xml文件中进行注册后才能使用
Service可以分为两类StartedService和BoundService
声明一个Service
声明一个类继承自Service类,在minifest.xml文件中注册
复写onStartCommand()方法允许这个Service可以被startService方法调用
复写onBind()方法允许这个Service可以被Bound
也可以同时重写这两个方法,使Service可以被start也可以bound
Service一些重要的回调方法
onCreate
onStartCommand //在1.6及之前叫做onStart
onBind
onDestory
Service生命周期
启动一个start Service
在一个Activity或者Service中可以启动一个Service
Intent intent=new Intent();
startService(intent);//是最简单的Service启动方式
只要使用了startService()方法,就有必要在之后调用stopSelf()或者stopService()来结束服务
启动一个IntentService
IntentService继承自Service,也是startService来启动,关键是IntentService可以启动另外的一个工作线程来处理Service事务
每次把一个intent传递给onHandleIntent方法进行处理,不用程序员调用stopSelf()方法
启动IntentService的方法与上面一个Service相同
不同的地方是Service继承自IntentService类,并且重写onHandlerIntent方法,通过此方法来进行intent处理
绑定一个Service
要创建一个绑定的Service,需要在Service类中重写onBind()方法来返回一个IBinder对象,提供接口来与Service进行交互
别的控件可以调用bindService()方法来得到这个接口并且调用Service中的服务
//在被绑定的Service类中重写onBind方法,返回一个IBinde对象,可以通过它来得到Service的引用,从而操作Service
//在要绑定service的控件中,比如这里的Activity
//Intent intent=new Intent(this,TestBindService);
//bindService(intent,conn,BIND_AUTO_CREATE); 这里的conn对象是一个ServiceConnection对象
//new一个ServiceConnection对象的话会自动重写onServiceConnected和onServiceDisconnected方法
//比如在onServiceConnected方法中获得返回的Binder
//newBinder getBinder=(newBinder)arg1; 这里arg1是onServiceConnected方法中返回的Binder参数
//TestBindService tbs=(TestBindService)getBinder.getService(); 这里获得了要绑定的Service的引用
//tbs.ServiceFunction(); 再通过这个引用来控制Service执行其中的方法
//在要绑定service的控件中,比如这里的Activity
//Intent intent=new Intent(this,TestBindService);
//bindService(intent,conn,BIND_AUTO_CREATE); 这里的conn对象是一个ServiceConnection对象
//new一个ServiceConnection对象的话会自动重写onServiceConnected和onServiceDisconnected方法
//比如在onServiceConnected方法中获得返回的Binder
//newBinder getBinder=(newBinder)arg1; 这里arg1是onServiceConnected方法中返回的Binder参数
//TestBindService tbs=(TestBindService)getBinder.getService(); 这里获得了要绑定的Service的引用
//tbs.ServiceFunction(); 再通过这个引用来控制Service执行其中的方法
在前台运行Service
在notification中设置一个进度条来让用户看到Service的执行进度
setForeground(); 被setForeground的Service基本不会被系统回收