服务的作用和目标:
让应用后台运行;
让应用能够跨进程访问,实现不同进程之间的通信。(AIDL(Android Interface definition language)一种通信接口描述语言)
注:服务没有自己的界面,长用于一些耗时操作,比如下载,播放音乐等。
服务的生命周期(三个阶段):
创建服务(public void onCreate(););
开始服务(public void onStart(Intent intent, int startId););
销毁服务(public void onDestroy(); )。
创建服务在启动服务(startService(serviceIntent);)时就会被调用,然后再调用开始服务,当收到销毁服务的命令(stopService(serviceIntent);)时才会调用销毁服务的方法。创建服务和销毁服务只会被调用一次。
服务作为四大组件之一,跟其他三个组件有着一个共同的特点,就是一旦创建一个服务之后就要在AndroidManifest.xml声明。
<service android:enabled="true" android:name=".MyService" />
由此可见,服务的生命周期应该是这样:
1.创建服务(这里要判断服务是否已经存在,若存在则跳到第二步)--->>2.开始服务--->3.销毁服务
服务的两种启动方式:
通过startService启动,stopService销毁;
通过将服务和Activity绑定,达到在Activity退出时能自动关闭服务的效果。
上述两种方式,第一种已经介绍过了,然后介绍第二种。
服务绑定:
public boolean bindService(Intent service, ServiceConnection conn, int flags);
第一个参数是一个Intent对象,第二个参数是用来连接被Intent指定的服务对象,第三个参数是标志位,通常为常量Context.BIND_AUTO_CREATE。
服务解除绑定:unbindService(serviceConnection);
绑定服务需要重写几个方法,分别是:
public IBinder onBind(Intent intent)
绑定成功后就会调用此方法
public void onRebind(Intent intent)
重新绑定后会调用此方法,如果不需要可以不重写
public boolean onUnbind(Intent intent)
解除绑定会调用此方法
然后需要我们在Activity中新建一个ServiceConnection的对象,并且重写ServiceConnection中的两个方法
private ServiceConnection serviceConnection = new ServiceConnection(){
// 连接服务失败后,该方法被调用
@Override
public void onServiceDisconnected(ComponentName name){
myService = null;
Toast.makeText(Main.this, "Service Failed.", Toast.LENGTH_LONG).show();
}
// 成功连接服务后,该方法被调用。在该方法中可以获得MyService对象
@Override
public void onServiceConnected(ComponentName name, IBinder service){
// 获得MyService对象
myService = ((MyService.MyBinder)service).getService();
Toast.makeText(Main.this, "Service Connected.", Toast.LENGTH_LONG).show() ;
}
};
AIDL服务:
需要新建一个后缀名为.aidl的文件,该文件是一个接口文件,但是该文件内不能加修饰符(public,private等)
然后新建一个Service子类,在该类里面写一个内部类继承于IMyService.Stub(该文件是创建.aidl文件时自动生成的),实现,aidl内的抽象方法。
将onBind方法的返回改为继承于MyService.Stub子类的对象。
然后绑定服务,服务对象可以由语句获得myService = IMyService.Stub.asInterface(service);该方法会存在在onServiceConnected方法里。