通过bindService方法实现Activity与Service的交互

一、在activity当中调用Service中的方法

例如,我现在写的音乐播放器的的例子,播放音乐,暂停音乐,下一首等待都是在Service类中实现的,而我要控制音乐播放的情况只能在activity中,这时候就要在activity当中调用Service中的方法。

通过bindService方法,我们可以得到绑定后返回的Service的实例,分为两步:


1) 在Service类中重写onBind方法

继承Binder的内部类,可以通过里面的方法得到Service实例

class PlayBinder extends Binder {
    public PlayService getPlayService(){
        return PlayService.this;
    }
}
@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    return new PlayBinder();//返回这个内部类
}
 
2) 在Activity中
 
private ServiceConnection conn = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {//IBinder service就是Service返回的Binder对象
        PlayService.PlayBinder binder = (PlayService.PlayBinder) service;//实例化内部类
        playService = binder.getPlayService();//调用内部类方法,得到Service实例


    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        playService = null;
    }
};

 
//绑定服务
public void bindPlayService(){
    if (!isBound){
        Intent intent = new Intent(this,PlayService.class);
        bindService(intent,conn, Context.BIND_AUTO_CREATE);
        isBound = true;
    }

}
这样就可以通过playService调用Service中的方法了



二、如何在Service当中调用Activity的方法呢?
还是音乐播放器的例子,这是在Service当中播放音乐,播放音乐的进度只有在Service当中可以得到,但是我们需要把播放音乐的进度显示当Activity中的UI组件上,这就涉及到在Service中调用Activity的方法

1)首先在Service中,
   定义一个内部接口,并且定义没有实现的方法,如下
//更新状态的接口
public interface MusicUpdateListener{
    public void onPublish(int progress);
    public void onChange(int position);
}
同时声明一个这个接口的对象,并且生成对应的setter方法

MusicUpdateListener musicUpdateListener;
public void setMusicUpdateListener(MusicUpdateListener musicUpdateListener) {
    this.musicUpdateListener = musicUpdateListener;
}
2)在Activity中,实例化一个这个接口的对象,并且实现里面的方法
private PlayService.MusicUpdateListener musicUpdateListener = new PlayService.MusicUpdateListener() {
    @Override
    public void onPublish(int progress) {
        publish(progress);
    }

    @Override
    public void onChange(int position) {
        change(position);
    }
};
用上面的方法在Activity得到Service的实例后,调用它的setMusicUpdateListener方法,把这个实例化后的接口对象设置进去
playService.setMusicUpdateListener(musicUpdateListener);
上面这句话一般在声明ServiceConnection时就直接实现了,如下:
private ServiceConnection conn = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        PlayService.PlayBinder binder = (PlayService.PlayBinder) service;
        playService = binder.getPlayService();

        //这样就在Activity中实现了PlayService中的内部接口,从而在PlayService中调用里面的方法实现对Activity组件的操作
        playService.setMusicUpdateListener(musicUpdateListener);

    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        playService = null;
    }
};

这时,在Service当中就可以直接通过内部接口对象调用里面的方法了,从而达到了在Service当中控制Activity组件的方法了。















 
 
 
 
 
 
 
 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值