我们有两种方式(start与bind)启动一个Service,每一种方式启动的Service生命周期是不一样的,这篇贴子主要写的是 start service。
它的生命周期中只有三个阶段:onCreate, onStartCommand(取代原来的onStart方法), onDestroy。如下图:
需要注意的有:
① 如果是 调用者 直接退出而没有调用 stopService 的话,那么被启动的 Service 会一直在后台运行,直至其stopService 方法被调用,或者它自己调用stopSelf 方法。
② 在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStartCommand()方法。如果调用startService() 方法前服务已经被创建,那么会直接调用onStartCommand()方法。也就是说,多次调用startService()方法并不会导致多次创建服 务。另外,不管被 start 多少次,只需一次 stop 便可将相应的service关闭。 ③ 具体的操作应该放在 onStartCommand() 里面 以下通过截图来看:
上图的中的四个按钮均是针对于同一个Service进行的操作,此时去 application ,可以查看到 "Running Service" 的列表如下:
这个,我们去点击上面的按钮(分别点击startservice 1 和 2 各两次),结果如下:
从图中,我们可以看出, onCreate() 方法只在第一次创建服务的时候被调用了。
现在,通过“返回键”来退回至主界面,然后再去 application 的 running service中去查看,可得下面的截图:
从此图中,我们可以看出,虽然Activity被finish掉了,但是由它启动的service仍然在后台运行着。
此时,重新打开该应用,然后直接点击 stop service 1 和 2 按钮各两次(不需再新点击 start service按钮),可以如下截图:
从此图中我们可以看出,只有第一次停止服务的时候,才会调用 onDestroy() 方法。
此时,再去 application 的 running service中去查看,可得下面的截图,发现服务确实已经被停止了:
下面附上部分源码(具体地请参见附件):
Java代码
1. // 四个按钮的响应事件
2.
3. private OnClickListener btnListener = new OnClickListener() {
4. @Override
5. public void onClick(View v) {
6. switch (v.getId()) {
7. case R.id.startSer1:
8. "Start Service 1 pressed");
9. // 启动服务(如果想传递数据,也可以将其封装进该intent)
10. startService(intent);
11. break;
12. case R.id.startSer2:
13. "Start Service 2 pressed");
14. startService(intent);
15. break;
16. case R.id.stopSer1:
17. "Stop Service 1 pressed");
18. // 停止服务
19. stopService(intent);
20. break;
21. case R.id.stopSer2:
22. "Stop Service 2 pressed");
23. stopService(intent);
24. break;
25. default:
26. break;
27. }
28. }
29. };
Java代码
1. // service 的实现
2. public class MyService extends Service {
3. private static final String TAG = "MyService";
4.
5. @Override
6. public void onCreate() {
7. super.onCreate();
8. " ----> onCreate()");
9. }
10.
11. @Override
12. public int onStartCommand(Intent intent, int flags, int startId) {
13. " ----> onStartCommand()");
14. return START_STICKY;
15. }
16.
17. @Override
18. public IBinder onBind(Intent intent) {
19. " ----> onBind()");
20. return null;
21. }
22.
23. @Override
24. public void onDestroy() {
25. super.onDestroy();
26. " ----> onDestroy()");
27. }
28. }
- ServiceDemo.zip (49.7 KB)
- 下载次数: 173
- 查看图片附件