Android中的Service是运行在后台的东西,最好的例子就是当你把播放器退出后,音乐都可以在后台播放。所以是没有界面的。
Service分为两种:
1、本地服务:本地服务用于程序内部,可以用startservice启动服务,用stopservice停止服务,在服务内部可以使用stopSelf或stopSelfResult来停止自己,无论调用了多少次startservice,都只需要调用一次stopService来停止service
2、远程服务:远程服务用于android系统内部的应用程序之间。可以定义接口并把接口暴露出来,以便其他应用进行操作。客户端建立到服务对象的连接,并通过那个连接来调用服务。远程服务需要用bindService方法建立连接,并启动,调用unbindService关闭连接。多个客户端可以绑定至同一个服务。
提供给可被其他应用复用,比如定义一个天气预报服务,提供与其他应用调用即可。
那么先来看Service的生命周期吧:如图:
我们可以定义一个本地服务继承Service,然后在这个服务里播放媒体播放器或者记录地理位置变化。通常有时候我们的Service要与Activity交互,那么可以可以定义一个内部类,返回这个Service,当然我们要考虑到如果是以绑定方式启动服务,那么内部类可以定义为继承Binder,然后返回本地服务,主要代码如下:
public class MyService extends Service {
private IBinder binder=new MyService.LocalBinder();
@Override
public IBinder onBind(Intent intent) {
return binder;
}
MediaPlayer mediaPlayer=null;
@Override
public void onCreate() {
//这里可以启动媒体播放器
// if(mediaPlayer==null)
// mediaPlayer=MediaPlayer.create(this, uri);
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("onStartCommand");
returnsuper.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
System.out.println("onDestory");
}
//定义内容类继承Binder
public class LocalBinder extends Binder {
MyServicegetService(){
returnMyService.this;
}
}
}
在类LocalBinder中的getService方法中是可以返回这个服务的,然后就可以在Activity中调用服务中的公用方法了。
Service有两种启动方式:
1、startservice
//启动服务
Intent intent = new Intent();
intent.setClass(MainActivity.this,MyService.class);
startService(intent);
2、bindservice
Intent intent = newIntent(this,MyService.class);
MyService myService =null;
bindService(intent, new ServiceConnection(){
@Override
publicvoid onServiceDisconnected(ComponentName name) {
//而在服务断开时候会调用onServiceDisconnected方法,我们可以清理一些服务资源
System.out.println("onServiceDisconnected");
myService= null;
}
@Override
publicvoid onServiceConnected(ComponentName name, IBinder service) {
//调用bindService方法启动服务时,如果服务器需要与Activity交互
//则可以通过onBind方法返回IBinder并返回当前本地服务
System.out.println("onServiceConnected");
myService= ((MyService.LocalBinder)service).getService();
myService.test_fun();
}
},Context.BIND_AUTO_CREATE);
在绑定服务的时候,需要一个服务连接对象,ServiceConnection,服务一旦连接,就会调用onServiceConnected方法,我们可以在这个方法里面返回我们的本地服务对象,具体看代码;而在服务断开时候会调用onServiceDisconnected方法,我们可以清理一些服务资源。