Android四大组件之Service(一)
在开发过程中Service使用的比较多,多做一些耗时的操作。先说一下都有哪些具体的应用:1、屏幕关闭后,传感器在后台进行记步等。2、服务器端的推送功能。3、天气预报。4、音乐播放器的一些流程可以放在Service里面。5、下载文件或上传文件可以放在Service里面进行。
Service分为两种工作状态,一种是启动状态,主要用于执行后台的计算(例如记步),另一种是绑定状态,主要用于其他组件与Service的交互。但是要注意Service的两种状态是可以共存的,Service既可以处于启动状态,同时可以处于绑定状态。
Service的生命周期,注意着两个方法,onCreate()、onDestory()。启动和绑定的时候执行onCreate(),在停止和解除绑定的时候执行onDestory()方法。
启动服务:新建一个service类继承Service,在Activity里面调用StartService方法,,在service类中会执行onCreate()方法、onStartCommand()方法,这时候想让服务执行一段代码,可以在onCreate()方法里面完成,也可以在onStartCommand()方法中完成,但是要注意只要外界启动一次service,就会执行onStartCommand()方法,但是onCreate()方法只有在第一次启动的时候会被调用。
绑定服务:需要在Activity里面调用bindService方法,bindService(intent,this,常量),方法中的三个参数,第一个是intent,第二个是服务的连接可以是this,第三个是常量。到那时这个this,需要实现两个方法:onServiceConnected,服务在绑定成功的时候会被调用。onServiceDisConnectde,服务进程崩溃的时候执行。想让服务执行一段程序,可以在
onServiceConnected里面完成。
启动服务和绑定服务的区别:同时启动服务、绑定服务,必须同时停止和解除服务。
一个Activity启动服务后,退出Activity,退出程序,服务还在运行。
一个Activity绑定服务后,退出Activity服务会取消绑定,还会提示错误。
对于绑定服务,可能会有一些疑问,为什么还要重写两个方法呢。调用绑定方法以后,service的onBind方法会返回一个Binder对象给客户端的,原则上Service的onBind方法被调用以后,Service就处于绑定状态了,但是onBind方法是Service的方法,客户端并不知道是否已经连接Service了,所以必须调用客户端中的onServiceConnected方法,确认连接。Service关于绑定的一个特性,多次绑定一个Service的时候,Service的onBind方法只会执行一次,除非Sevice被终止了。
Service通信:
对于启动服务的数据传递:
通过Intent进行数据传递
Intent intent=new Intent(ConnectService.this,MyService_conn.class); intent.putExtra("data","啦啦啦"); startService(intent);在Service类中的onStartCommand(),方法中的intent参数接收传递信息:
public int onStartCommand(Intent intent, int flags, int startId) { intent.getStringExtra("data"); return super.onStartCommand(intent, flags, startId); }对于绑定服务之间进行通信:
绑定的Service是通过Binder进行通信。
在Service类中创建实例
public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. return new Binder(); } //绑定的Service通过Binder进行通信 public class Binder extends android.os.Binder { public void setDate(String data) { MyService_conn.this.data=data; } }
private MyService_conn.Binder binder;
/** * 这个方法里面的第二个参数他说访问到的是服务那个IBinder里面的返回值,也就是BInder类的实例 */ public void OnServiceConnected(ComponentName name, IBinder service) { System.out.println("服务已经连接成功了"); binder= (MyService_conn.Binder) service; }然后直接调用setDate方法就可以传递数据了。这是绑定Service进行通信。