服务的生命周期跟启动服务的方法有关:
当采用Context.startService()方法启动服务,与之有关的生命周期方法
onCreate() onStart() onDestroy()
onCreate()该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或bindService()方法,服务也只被创建一次。
onStart() 只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方法尽管不会多次创建服务,但onStart() 方法会被多次调用。
onDestroy()该方法在服务被终止时调用。
当采用Context.bindService()方法启动服务,与之有关的生命周期方法
onCreate() onBind() onUnbind() onDestroy()
onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。
onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用。
如果先采用startService()方法启动服务,然后调用bindService()方法绑定到服务,再调用unbindService()方法解除绑定,最后调用bindService()方法再次绑定到服务,触发的生命周期方法如下:
onCreate()onStart()onBind()onUnbind()[重载后的方法需返回true]onRebind()
利用bindservice()调用服务里面的方法:
开启服务 (startservice)
服务一旦开启与调用者没有任何的关系 , 调用着的activity 即便是退出了 不会影响。后台的service的运行.在activity里面 不能去调用服务里面的方法 .只要不stop,就是无限期的。
通过绑定方式开启服务(bindservice)
服务跟调用者不求同生 ,但求同死.如果调用者(activity)退出了 那他绑定的服务呢 也会跟着退出.我们可以在activity里面调用服务里面的方法.利用 serviceSonnection 接口 返回一个ibinder对象 , 拿着ibinder对象获取到服务里面方法的引用(自定义了一个接口信息) ,调用服务里面的方法 。
代码示例:
自定义接口IService.java:
1
2
3
4
5
|
package
cn.itcast.servicelife;
public
interface
IService {
public
void
callMethodInService();
}
|
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
44
45
46
47
48
49
50
51
52
53
54
55
56
|
package
cn.itcast.servicelife;
import
android.app.Service;
import
android.content.Intent;
import
android.os.Binder;
import
android.os.IBinder;
public
class
MyService
extends
Service {
// 初始化服务时运行
@Override
public
IBinder onBind(Intent intent) {
System.out.println(
"on bind"
);
return
new
MyBinder();
}
public
class
MyBinder
extends
Binder
implements
IService {
@Override
public
void
callMethodInService() {
sayHelloInService();
}
}
/**
* 服务里面的一个方法
*/
public
void
sayHelloInService() {
System.out.println(
"hello in service"
);
}
@Override
public
boolean
onUnbind(Intent intent) {
System.out.println(
"on unbind"
);
return
super
.onUnbind(intent);
}
@Override
public
void
onCreate() {
System.out.println(
"oncreate"
);
super
.onCreate();
}
@Override
public
void
onStart(Intent intent,
int
startId) {
System.out.println(
"onstart"
);
super
.onStart(intent, startId);
}
@Override
public
void
onDestroy() {
System.out.println(
"ondestroy"
);
super
.onDestroy();
}
}
|
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
package
cn.itcast.servicelife;
import
android.app.Activity;
import
android.content.ComponentName;
import
android.content.Context;
import
android.content.Intent;
import
android.content.ServiceConnection;
import
android.os.Bundle;
import
android.os.IBinder;
import
android.view.View;
import
android.view.View.OnClickListener;
import
android.widget.Button;
import
android.widget.Toast;
public
class
DemoActivity
extends
Activity
implements
OnClickListener {
Button bt_start;
Button bt_stop;
Button bt_bind_service;
// 绑定服务
Button bt_unbind_service;
// 解除绑定服务
Button bt_call_service;
Intent intent;
MyConn conn;
IService iService;
int
flag =
0
;
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
bt_start = (Button)
this
.findViewById(R.id.button1);
bt_stop = (Button)
this
.findViewById(R.id.button2);
bt_bind_service = (Button)
this
.findViewById(R.id.button3);
bt_unbind_service = (Button)
this
.findViewById(R.id.button4);
bt_call_service = (Button)
this
.findViewById(R.id.button5);
bt_start.setOnClickListener(
this
);
bt_stop.setOnClickListener(
this
);
bt_bind_service.setOnClickListener(
this
);
bt_unbind_service.setOnClickListener(
this
);
bt_call_service.setOnClickListener(
this
);
intent =
new
Intent(
this
, MyService.
class
);
conn =
new
MyConn();
}
@Override
public
void
onClick(View v) {
switch
(v.getId()) {
case
R.id.button1:
// 开启服务
startService(intent);
break
;
case
R.id.button2:
// 停止服务
stopService(intent);
break
;
case
R.id.button3:
// 绑定服务
bindService(intent, conn, Context.BIND_AUTO_CREATE);
break
;
case
R.id.button4:
// 解除绑定服务
if
(flag ==
0
) {
Toast.makeText(getBaseContext(),
"还没有绑定服务,无需解绑"
,
0
).show();
}
else
{
unbindService(conn);
flag =
0
;
}
break
;
// 绑定开启
case
R.id.button5:
// 调用服务里面的方法
iService.callMethodInService();
break
;
}
}
private
class
MyConn
implements
ServiceConnection {
// 绑定一个服务成功的时候 调用 onServiceConnected
@Override
public
void
onServiceConnected(ComponentName name, IBinder service) {
flag =
1
;
iService = (IService) service;
}
@Override
public
void
onServiceDisconnected(ComponentName name) {
}
}
// DemoActivity的销毁方法
@Override
protected
void
onDestroy() {
if
(flag ==
1
) {
unbindService(conn);
}
super
.onDestroy();
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<!--?xml version=
"1.0"
encoding=
"utf-8"
?-->
<manifest xmlns:android=
"http://schemas.android.com/apk/res/android"
package
=
"cn.itcast.servicelife"
android:versioncode=
"1"
android:versionname=
"1.0"
>
<uses-sdk android:minsdkversion=
"8"
>
<intent-filter>
<category android:name=
"android.intent.category.LAUNCHER"
>
</category></action></intent-filter>
</activity>
<service android:name=
".MyService"
>
</service>
</application>
</uses-sdk></manifest>
|