1. 程式人生 > >Service生命週期詳解

Service生命週期詳解

  • 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");
     //設定全包名
    
    intent.setPackage(getPackageName()); //繫結service 需要ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.d("MainActivity", "bind_關聯"); } @Override public void onServiceDisconnected(ComponentName name) { Log.d
    ("MainActivity", "取消關聯"); } };

  • 在Service的生命週期中,被回撥的方法比Activity少一些,只有五種:

    • onCreate
    • onStartCommand
    • onDestroy
    • onBind
    • onUnbind

    通常有兩種方式啟動一個Service,他們對Service生命週期的影響是不一樣的。

    1. 通過startService

      • Service會經歷 onCreate 到onStart,然後處於執行狀態,stopService的時候呼叫onDestroy方法。
      • 如果是呼叫者自己直接退出而沒有呼叫stopService的話,Service會一直在後臺執行。
    2. 通過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;
    }
    }