Service生命週期詳解
阿新 • • 發佈:2019-01-31
-
Service四大組織之一 需要在清單檔案裡註冊
-
<service android:name=".My_Serve"> <intent-filter> <action android:name="my_menu_seaver" /> </intent-filter> </service>
-
//設定Intent 需要跳轉的Service intent = new Intent("my_menu_seaver"); // intent.setAction("my_menu_seaver"); //設定全包名
-
在Service的生命週期中,被回撥的方法比Activity少一些,只有五種:
- onCreate
- onStartCommand
- onDestroy
- onBind
- onUnbind
通常有兩種方式啟動一個Service,他們對Service生命週期的影響是不一樣的。
-
通過startService
- Service會經歷 onCreate 到onStart,然後處於執行狀態,stopService的時候呼叫onDestroy方法。
- 如果是呼叫者自己直接退出而沒有呼叫stopService的話,Service會一直在後臺執行。
-
通過bindService
- Service會執行onCreate,然後是呼叫onBind, 這個時候呼叫者和Service繫結在一起。呼叫者退出了,Srevice就會呼叫onUnbind->onDestroyed方法。
- 所謂繫結在一起就共存亡了。呼叫者也可以通過呼叫unbindService方法來停止服務,這時候Srevice就會呼叫onUnbind->onDestroyed方法。
需要注意的是如果這幾個方法交織在一起的話,會出現什麼情況呢?
一個原則是Service的onCreate的方法只會被呼叫一次,就是你無論多少次的startService又bindService,Service只被建立一次。
-
如果先是bind了,那麼start的時候就直接執行Service的onStart方法,如果先是start,那麼bind的時候就直接執行onBind方法。
-
如果service執行期間呼叫了bindService,這時候再呼叫stopService的話,service是不會呼叫onDestroy方法的,service就stop不掉了,只能呼叫UnbindService, service就會被銷燬
-
如果一個service通過startService 被start之後,多次呼叫startService 的話,service會多次呼叫onStart方法。多次呼叫stopService的話,service只會呼叫一次onDestroyed方法。
-
如果一個service通過bindService被start之後,多次呼叫bindService的話,service只會呼叫一次onBind方法。
-
多次呼叫unbindService的話會丟擲異常。
-
@Override public void onClick(View v) { switch (v.getId()) { case R.id.start_Btn: //啟動 startService(intent); break; case R.id.bind_Start_Btn: //繫結 bindService(intent, connection, BIND_AUTO_CREATE); break; case R.id.stop_Btn: //停止 stopService(intent); break; case R.id.jiebang: //解綁 unbindService(connection); break; case R.id.start_intent_Btn: //跳轉 break; } }