通过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
    评论
以下是ActivityService交互相关的面试题及答案: 1. Activity如何启动Service? 答:Activity可以通过调用`startService()`方法来启动Service。例如: ```java Intent intent = new Intent(this, MyService.class); startService(intent); ``` 2. Service如何与Activity进行通信? 答:Service可以通过Binder机制与Activity进行通信。以下是一些实现方式: - Service中定义Binder ```java public class MyService extends Service { private final IBinder mBinder = new MyBinder(); public class MyBinder extends Binder { public MyService getService() { return MyService.this; } } @Nullable @Override public IBinder onBind(Intent intent) { return mBinder; } public int getRandomNumber() { return new Random().nextInt(100); } } ``` - Activity中绑定Service,并获取Service实例 ```java private MyService mService; private boolean mBound = false; private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { MyService.MyBinder binder = (MyService.MyBinder) service; mService = binder.getService(); mBound = true; } @Override public void onServiceDisconnected(ComponentName arg0) { mBound = false; } }; @Override protected void onStart() { super.onStart(); Intent intent = new Intent(this, MyService.class); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); } @Override protected void onStop() { super.onStop(); if (mBound) { unbindService(mConnection); mBound = false; } } public void onClick(View view) { if (mBound) { int num = mService.getRandomNumber(); Toast.makeText(this, "number: " + num, Toast.LENGTH_SHORT).show(); } } ``` 3. Service如何在后台执行任务并向Activity发送结果? 答:Service可以通过Handler机制向Activity发送结果。以下是一个例子: - Service中定义Handler ```java public class MyService extends Service { private Looper mServiceLooper; private ServiceHandler mServiceHandler; private final class ServiceHandler extends Handler { public ServiceHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { // 执行任务 int result = doWork(); // 发送结果 Message message = mHandler.obtainMessage(); message.arg1 = result; mHandler.sendMessage(message); } } @Override public void onCreate() { super.onCreate(); HandlerThread thread = new HandlerThread("ServiceStartArguments", Process.THREAD_PRIORITY_BACKGROUND); thread.start(); // 获取Handler的Looper mServiceLooper = thread.getLooper(); // 创建ServiceHandler mServiceHandler = new ServiceHandler(mServiceLooper); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Message message = mServiceHandler.obtainMessage(); message.arg1 = startId; mServiceHandler.sendMessage(message); // Service执行完任务后自动停止 return START_NOT_STICKY; } private int doWork() { // 执行任务 return new Random().nextInt(100); } // Activity中定义Handler private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { Toast.makeText(getApplicationContext(), "Result: " + msg.arg1, Toast.LENGTH_SHORT).show(); } }; @Nullable @Override public IBinder onBind(Intent intent) { return null; } } ``` - Activity调用Service ```java Intent intent = new Intent(this, MyService.class); startService(intent); ``` 通过以上的例子可以看出,Service可以在后台执行任务,并通过Handler机制将结果发送给Activity

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值