Service服务销毁相关内容

如果一个服务同时被绑定和启动时,那么如果正确的销毁这个服务呢?

  • 马上学Android 035 - Android Service入门到精通04 - 如何销毁同时被绑定和启动的服务

首先一个要解决的问题是,多次取消绑定服务程序崩溃的问题,需要添加一个布尔值变量。

1
2
3
4
5
6
7
8
9
10
11
12
private boolean isBind = false;
在绑定的时候进行赋值:

isBind = bindService(intent, serviceConnection, BIND_AUTO_CREATE);


在取消绑定的时候进行判断

if (isBind) {
unbindService(serviceConnection);
isBind = false;
}

这样通过简单的代码就可解决多次取消绑定服务带来的问题。

定义一个服务

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
public class StartAndBindService extends Service {

private static final String TAG = "StartAndBindService";

private MyBinderClass mybinder = new MyBinderClass();

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

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

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG,"StartAndBindService --> onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public boolean onUnbind(Intent intent) {
Log.i(TAG,"StartAndBindService --> onUnbind");
return super.onUnbind(intent);
}

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

public class MyBinderClass extends Binder{
public void Show(){
Log.i(TAG,"StartAndBindService --> Show()");
}
}
}

注册Service

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

</service>

实现绑定和启动服务的按钮响应

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

private class ButtonListener implements View.OnClickListener{

@Override
public void onClick(View view) {
switch(view.getId()) {
case R.id.btnStart_StartBindService:
Intent intent = new Intent(StartServiceActivity.this, StartAndBindService.class);
startService(intent);
break;
case R.id.btnStop_StartBindService:
Intent stopIntent = new Intent(StartServiceActivity.this, StartAndBindService.class);
stopService(stopIntent);
break;
case R.id.btnBind_StartBindService:
Intent bindIntent = new Intent(StartServiceActivity.this, StartAndBindService.class);
isBind = bindService(bindIntent,conn,BIND_AUTO_CREATE);
break;
case R.id.btnUnBind_StartBindService:
unbindService(conn);
break;
}
}
}

运行程序的结果是:如果一个服务被启动了,那么如果同时被绑定的话,那么此时服务不会被重新创建。那么如果要销毁这个服务的话,直接调用stopService是无法停止服务的,需要通过调用unBindService来停止服务。