Android之service篇(一)本地service

来源:互联网 发布:域名模板是什么 编辑:程序博客网 时间:2024/06/10 15:31

         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方法,我们可以清理一些服务资源。

0 0