Bound服务之Binder

Bound服务的简介:

bound服务是 Service 类的一种实现,它允许其它应用程序与其绑定方法返回一个 IBinder 对象,此对象定义了客户端与服务进行交互时所需的编程接口。

创建Bound服务基于扩Binder

如果你的服务只用于本地应用程序并且不需要跨进程工作,那你只要实现自己的 Binder 类即可,这样你的客户端就能直接访问服务中的公共方法了。仅当客户端和服务位于同一个应用程序和进程中,这也是最常见的情况,这种方式才会有用。比如,一个音乐应用需要把一个activity绑定到它自己的后台音乐播放服务上,采用这种方式就会很不错。

具体实现步骤如下:

1.在你的服务中,创建一个Binder的实例

    // 给客户端的Binder
    private final IBinder mBinder = new LocalBinder();
    /**
     * 用于客户端Binder的类。
     * 因为知道本服务总是运行于与客户端相同的进程中,我们就不需要用IPC进行处理。
     */
    public class LocalBinder extends Binder {
             LocalService getService() {
             return LocalService.this;
        }

2.从回调方法onBind()中返回Binder的该实例

 @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

Service完整代码如下:

public class LocalService extends Service {
    // 给客户端的Binder
    private final IBinder mBinder = new LocalBinder();
    // 生成随机数
    private final Random mGenerator = new Random();

    /**
     * 用于客户端Binder的类。
     * 因为知道本服务总是运行于与客户端相同的进程中,我们就不需要用IPC进行处理。
     */
    public class LocalBinder extends Binder {
        LocalService getService() {
        return LocalService.this;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    //服务端的功能代码,供客户端调用
    public int getRandomNumber() {
      return mGenerator.nextInt(100);
    }
}

3.在客户端中,在回调方法onServiceConnected()中接收Binder并用所提供的方法对绑定的服务进行调用

public class BindingActivity extends Activity {
    LocalService mService;
    boolean mBound = false;

    @Override
    protected void onStart() {
        super.onStart();
        // 绑定到LocalService
        Intent intent = new Intent(this, LocalService.class);
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onStop() {
        super.onStop();
        // 与服务解除绑定
        if (mBound) {
            unbindService(mConnection);
            mBound = false;
        }
    }

    /** 定义服务绑定时的回调方法,用于传给bindService() */
    private ServiceConnection mConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName className,
                IBinder service) {
            /**这里的IBinder类型参数service便是LocalService中public IBinder onBind(Intent intent)方法返回的mBinder   */
            LocalBinder binder = (LocalBinder) service;
           /**LocalBinder为客户端提供了getService()方法,用于返回LocalService的实例。 这就让客户端可以调用服务中的公共方法。*/
            mService = binder.getService();
            mBound = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName arg0) {
            mBound = false;
        }
    };
}

音乐播放器实现原理
服务端Service:

public class MusicService extends Service{

    MediaPlayer player;
    //歌曲文件地址
    String path=null;

    @Override
    public IBinder onBind(Intent intent) {
        return new MusicController();
    }


    //必须继承binder,才能作为中间人对象返回
    class MusicController extends Binder{
         MusicService getMusicService(){
               return  MusicService.this;
           }
    }
    //服务创建的时候
    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        player = new MediaPlayer();
    }

    //服务销毁的时候
    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        //停止播放
        player.stop();
        //释放占用的资源,此时player对象已经废掉了
        player.release();
        player = null;
    }


    public void play(){
        System.out.println("播放音乐");
        //重置
        player.reset();
        try {
            //加载多媒体文件
            player.setDataSource(path);
            player.prepareAsync();//异步准备
            player.setOnPreparedListener(new OnPreparedListener()     {
            //准备完毕时,此方法调用
                @Override
                public void onPrepared(MediaPlayer mp) {
                    player.start();
                }
            });
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
    }

    public void pause(){
        System.out.println("暂停播放");
        player.pause();
    }
}

客户端Activity:

public class MainActivity extends Activity {

    MusicService musicService;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent(this, MusicService.class);
        //混合调用
        //为了把服务所在进程变成服务进程
        startService(intent);
        //绑定服务
        bindService(intent, new MusicServiceConn(), BIND_AUTO_CREATE);
    }

    class MusicServiceConn implements ServiceConnection{
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // TODO Auto-generated method stub
            MusicController mc=(MusicController)service;
            musicService=mc.getMusicService();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub

        }

    }

    //开始播放按钮
    public void play(View v){
        musicService.play();
    }
    //暂停播放按钮
    public void pause(View v){
        musicService.pause();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值