前面讲完了四大组件中的Activity,这里在讲解一下另一个重要的的组件Service。Service常见的场景可以应用于后台应用的下载,或者是后台的轮询操作。后台执行一些耗时的操作。
Service的启动
service启动的方式主要有两种:
- startService启动service
- bindService启动service
两种启动方式的区别:
- startService启动Service
- 首次启动会创建一个Service实例,依次调用onCreate()和onStartCommand()方法,此时Service 进入运行状态,如果再次调用StartService启动Service,将不会再创建新的Service对象, 系统会直接复用前面创建的Service对象,调用它的onStartCommand()方法!
- Service与它的调用者无必然的联系,就是说当调用者结束了自己的生命周期, 但是只要不调用stopService,那么Service还是会继续运行的!
- 无论启动了多少次Service,只需调用一次StopService即可停掉Service
- BindService启动Service
- 当首次使用bindService绑定一个Service时,系统会实例化一个Service实例,并调用其onCreate()和onBind()方法,然后调用者就可以通过IBinder和Service进行交互,此后如果再次使用bindService绑定Service,系统不会创建新的Sevice实例,也不会再调用onBind()方法,只会直接把IBinder对象传递给其他后来增加的客户端!
- 如果我们解除与服务的绑定,只需调用unbindService(),此时onUnbind和onDestory方法将会被调用!这是一个客户端的情况,假如是多个客户端绑定同一个Service的话,情况如下 当一个客户完成和service之间的互动后,它调用 unbindService() 方法来解除绑定。当所有的客户端都和service解除绑定后,系统会销毁service。(除非service也被startService()方法开启)
- bindService模式下的Service是与调用者相互关联的,在bindService后,一旦调用者销毁,那么Service也立即终止!
Service生命周期
这里进行测试
-
通过startService方式启动
public void start(View view) { Intent intent = new Intent(SecondActivity.this, FirstService.class); startService(intent); } public void stop(View view) { Intent intent = new Intent(SecondActivity.this, FirstService.class); stopService(intent); }
首次启动service
04-25 21:55:17.525 1263-1263/com.isdust.zor.view_learn D/FirstService: onCreate 04-25 21:55:17.525 1263-1263/com.isdust.zor.view_learn D/FirstService: onStartCommand
从日志中可以看出,当start依次调用了oncreate和onStartCommand
第二次启动service
`04-25 22:00:34.075 1263-1263/com.isdust.zor.view_learn D/FirstService: onStartCommand
`
这里可以视为两次启动了service,看一下stopservice的情况 04-25 22:04:37.325 1263-1263/com.isdust.zor.view_learn D/FirstService: onDestroy
可以看到只调用了依次destory,因此,可以明确的看出service不会生成多次
这种情况下,service和activity没有必然的联系。当activitydestroy后,service依然运行。
- BindService方式
bindservice时
04-25 22:10:43.005 1263-1263/com.isdust.zor.view_learn D/FirstService: onCreate
04-25 22:10:43.005 1263-1263/com.isdust.zor.view_learn D/FirstService: onBind
可以看到首次bind时,只是调用了onCreate和onBind
unbindService时
04-25 22:20:43.565 1929-1929/com.isdust.zor.view_learn D/FirstService: onUnbind
04-25 22:20:43.565 1929-1929/com.isdust.zor.view_learn D/FirstService: onDestroy
可以看到,依次调用了onUnbind和onDestroy
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。