有了启动形式的服务之后,再来看看绑定服务的创建形式

  • 马上学Android 034 - Android Service入门到精通03 - 创建绑定形式的服务

需要创建一个继承自Service的类并重写onBind()方法,具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

public class BindService extends Service {

private MyBinder myBinder = new MyBinder();

private static final String TAG = "BindService";

@Override
public void onCreate() {
Log.i(TAG,"BindService - > onCreate");
super.onCreate();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG,"BindService - > onStartCommand");//只有startService会调用
return super.onStartCommand(intent, flags, startId);
}

@Override
public boolean onUnbind(Intent intent) {
Log.w(TAG,"BindService - > onUnbind");
return super.onUnbind(intent);
}

@Override
public void onDestroy() {
Log.e(TAG,"BindService - > onDestroy");
super.onDestroy();
}

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

public class MyBinder extends Binder{
public void StartDownload(){
//模拟下载文件方法
Log.i(TAG,"BinderService正在执行下载任务");
}
}
}

和启动服务不同的是,绑定形式服务需要返回一个IBind类型的服务,所以需要创建一个继承自Binder的类,并定义一个模拟下载的方法。

1
2
3
4
5
6
public class MyBinder extends Binder{
public void StartDownload(){
//模拟下载文件方法
Log.i(TAG,"BinderService正在执行下载任务");
}
}

然后定义一个MyBinder对象

1
private MyBinder myBinder = new MyBinder();

在onBind()方法后返回myBinder,这样就完成了绑定类型服务的创建。

有了绑定服务之后,需要在AndroidManifest.xml进行注册,当然最少需要指定Service名称属性。

1
2
3
<service android:name="com.chen.service.BindService">

</service>

有了绑定的服务之后,如何在Activity进行调用呢?这里有几个步骤:

1.需要定义一个MyBinder对象和ServiceConnection对象

1
2

private BindService.MyBinder myBinder;
1
2
3
4
5
6
7
8
9
10
11
12
13
14

private ServiceConnection serviceConnection = new ServiceConnection() {

@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
myBinder = (BindService.MyBinder) iBinder;
myBinder.StartDownload();
}

@Override
public void onServiceDisconnected(ComponentName componentName) {

}
};

有了上面的定义有就可以通过intent和bindService方法来到绑定服务:

1
2
3
4

//绑定服务
Intent intent = new Intent(StartServiceActivity.this, BindService.class);
bindService(intent, serviceConnection, BIND_AUTO_CREATE);

bindService需要传入相对于的intent和connection以及绑定的创建服务的标志。

取消绑定的话比较简单,代码如下:

1
2

unbindService(serviceConnection);

绑定服务相对于启动服务来说稍微复杂一点,需要创建更多的东西。这个有个问题,如何优化取消绑定?否则程序会因为取消两次而崩溃。