天天看點

startService,bindService混合使用的生命周期問題

單獨使用startService

onCreate()->onStartCommand()->Running->onDestroy()

單獨使用bindService

onCreate()->onBind()->Running->onUnbind()->onDestroy()

混用

startService與bindService混合使用的執行順序無非就是四種。現有serviceA執行個體,執行個體中列印了生命周期的各個方法,四種情況的執行結果如下:

  • startService -> bindService->stopService -> unbindService

    08-09 10:57:27.410 18963-18963/com.lb.secdemo I/secDemo: startService

    08-09 10:57:27.435 18963-18963/com.lb.secdemo I/secDemo: serviceA onCreate

    08-09 10:57:27.436 18963-18963/com.lb.secdemo I/secDemo: serviceA onStartCommand

    08-09 10:57:31.304 18963-18963/com.lb.secdemo I/secDemo: bindService

    08-09 10:57:31.319 18963-18963/com.lb.secdemo I/secDemo: serviceA onBind

    08-09 10:57:44.391 18963-18963/com.lb.secdemo I/secDemo: stopService

    08-09 10:57:50.749 18963-18963/com.lb.secdemo I/secDemo: unbindService

    08-09 10:57:50.761 18963-18963/com.lb.secdemo I/secDemo: serviceA onUnbind

    08-09 10:57:50.762 18963-18963/com.lb.secdemo I/secDemo: serviceA onDestroy

  • startService -> bindService->unbindService -> stopService

    08-09 11:01:00.221 19420-19420/com.lb.secdemo I/secDemo: startService

    08-09 11:01:00.240 19420-19420/com.lb.secdemo I/secDemo: serviceA onCreate

    08-09 11:01:00.241 19420-19420/com.lb.secdemo I/secDemo: serviceA onStartCommand

    08-09 11:01:03.146 19420-19420/com.lb.secdemo I/secDemo: bindService

    08-09 11:01:03.168 19420-19420/com.lb.secdemo I/secDemo: serviceA onBind

    08-09 11:01:07.139 19420-19420/com.lb.secdemo I/secDemo: unbindService

    08-09 11:01:07.144 19420-19420/com.lb.secdemo I/secDemo: serviceA onUnbind

    08-09 11:01:22.781 19420-19420/com.lb.secdemo I/secDemo: stopService

    08-09 11:01:22.789 19420-19420/com.lb.secdemo I/secDemo: serviceA onDestroy

  • bindService -> startService->stopService -> unbindService

    08-09 11:03:07.336 20032-20032/com.lb.secdemo I/secDemo: bindService

    08-09 11:03:07.349 20032-20032/com.lb.secdemo I/secDemo: serviceA onCreate

    08-09 11:03:07.353 20032-20032/com.lb.secdemo I/secDemo: serviceA onBind

    08-09 11:03:13.074 20032-20032/com.lb.secdemo I/secDemo: startService

    08-09 11:03:13.092 20032-20032/com.lb.secdemo I/secDemo: serviceA onStartCommand

    08-09 11:03:19.254 20032-20032/com.lb.secdemo I/secDemo: stopService

    08-09 11:03:21.529 20032-20032/com.lb.secdemo I/secDemo: serviceA unbindService

    08-09 11:03:21.546 20032-20032/com.lb.secdemo I/secDemo: serviceA onUnbind

    08-09 11:03:21.551 20032-20032/com.lb.secdemo I/secDemo: serviceA onDestroy

  • bindService -> startService->unbindService -> stopService

    08-09 11:01:58.195 19758-19758/com.lb.secdemo I/secDemo: bindService

    08-09 11:01:58.212 19758-19758/com.lb.secdemo I/secDemo: serviceA onCreate

    08-09 11:01:58.213 19758-19758/com.lb.secdemo I/secDemo: serviceA onBind

    08-09 11:02:01.414 19758-19758/com.lb.secdemo I/secDemo: startService

    08-09 11:02:01.433 19758-19758/com.lb.secdemo I/secDemo: serviceA onStartCommand

    08-09 11:02:15.702 19758-19758/com.lb.secdemo I/secDemo: unbindService

    08-09 11:02:15.708 19758-19758/com.lb.secdemo I/secDemo: serviceA onUnbind

    08-09 11:02:23.204 19758-19758/com.lb.secdemo I/secDemo: stopService

    08-09 11:02:23.216 19758-19758/com.lb.secdemo I/secDemo: serviceA onDestroy

##總結

無論啟動和停止service的先後順序如何,如果有startService和bindService混用的情況下,隻有當service的兩個引用關系都被釋放後(stopService和unbindService都被調用),service的生命周期才會結束。