服务的生命周期跟Activity的生命周期类似。但是生命周期甚至比你关注服务如何创建和销毁更重要,因为服务能够在用户不知情的情况下在后台运行。
服务的生命周期---从创建到销毁---可以被分为以下两个路径:
1. 启动类型的服务: onCreate()- >onStartCommand()->Service running--调用context.stopService() ->onDestroy()
2. 绑定类型的服务: onCreate()->onBind()->Service running--调用>onUnbind() -> onDestroy()
其中绑定服务才可以调用服务中的方法
以下是笔者写的一个demo代码:
1 @Override 2 public void onCreate() { 3 System.out.println("服务被创建了concreate"); 4 super.onCreate(); 5 } 6 7 @Override 8 public int onStartCommand(Intent intent, int flags, int startId) { 9 System.out.println("开启服务 onStartCommand "); 10 return super.onStartCommand(intent, flags, startId); 11 } 12 13 @Override 14 public IBinder onBind(Intent intent) { 15 System.out.println("绑定服务调用了 onBind"); 16 return new MyBinder(); 17 } 18 19 @Override 20 public boolean onUnbind(Intent intent) { 21 System.out.println("解绑服务 onUnbind"); 22 return super.onUnbind(intent); 23 } 24 25 26 @Override 27 public void onDestroy() { 28 System.out.println("服务被销毁了ondestroy"); 29 super.onDestroy(); 30 } 31
其中onCreate方法已经过时,取而代之的是onStartCommand()
1. 启动类型的服务
(1) 第一次启动服务时:
执行了onCreate方法和onStartCommand方法
(2) 再次点击开启服务:
只会执行onStartCommand方法
(3) 停止服务
执行onDestroy方法
2. 绑定类型的服务
(1) 绑定服务
调用了onCreate方法和onBind方法
(2) 解绑服务
先调用了onUnBind方法再调用onDestroy方法
下图说明了一个服务的典型回调方法。尽管这个图把由startService()方法创建的服务与由bindService()方法创建的服务给分开了,
但是请记住,任何服务,不管它是怎样启动的,都可能允许客户绑定它。
因此用onStartCommand()方法(通过一个客户端调用startService()方法)初始启动的服务,
依然能够接收onBind()的调用(在客户端调用bindService()方法时)。
图的左边显示了用startService()方法创建服务时的生命周期
图的右边显示了用bindService()方法创建服务时的生命周期
注意: 建议启动服务的顺序,这样不会出现问题:
1. 开启服务 --- 保证服务一直后台运行
2. 绑定服务 --- 可以调用服务中的方法
3. 调用服务中的方法
4. 解绑服务 --- 这时服务依然后台运行
5. 停止服务