通过前面的学习,可以发现使用 start方式开启 Service 非常简单,但是它有一个技大的弊端,没有办法与开启者进行通信。为了解决这个问题,我们一般会使用 bind方式来定 Service。以bind方式创建与绑定 Service 的步骤在之前也已讲述,此处将用一个实例来进行讲解。
1、创建一个继承Service 类的子类 MyService类,由于是采用 bind方式绑定Service, 因此 MyService 类与前文以start方式开启Service而创建的继承Service 类的子类有很大不同。
前文说过,采用此种方式绑定 Servce 时会回调 onBind()方法,此方法会返回一个IBind 类的对象。一般情况下,如果我们在某个Activity 中绑定了此 Service,就会从ServiceConnection 类 onServiceConnected(ComponentName name, IBinder service)方法中获取到 onBind()方法返回的IBind类的对象。Activity与Service可以进行通信,利用的就是这个IBind 类的对象。
所以,我们可以建立一个IBind类的子类,并在该类中封装 Service 对象,并在 onBind()方法中返回此类的对象。这样一来,在 Activity中就可以对 Service进行操作了。MyService类代码如下∶
package com.rfstar.servicetest2;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
public class MyService extends Service {
private String message;
private boolean isrunning = true;
private IBinder binder = new MyBinder();
private MyService.ServiceThread serviceThread=new MyService.ServiceThread();
private Thread thread;
@Override
public IBinder onBind(Intent intent) {
Log.i("service", "onBind");
thread = new Thread(serviceThread);
//开启一个线程
thread.start();
/**返回一个可以在Activity的onServiceConnected()方法中接收的binder对象
* 它是Activity和Service通信的桥梁
* 在Activity中通过这个bind对象可以得到Service的实例引用
* 通过获取的Service实例就可以调用相关方法和属性
*/
return binder;
}
@Override
public void onCreate() {
Log.i("service", "oncreate");
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("service", "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public boolean onUnbind(Intent intent) {
Log.i("service", "onUnbind");
return super.onUnbind(intent);