1. 程式人生 > >Service兩種啟動方式的區別

Service兩種啟動方式的區別

一、Service第一種啟動方式startService

生命週期:oncreate——>onstartCommand——>onDestroy;多次通過該方法啟動Service,oncreate函式只會被呼叫一次,onStartCommand函式會被多次呼叫,但只需要呼叫一次stopService就可以銷燬該Service;

特點說明:通過該啟動方式啟動Service,一旦Service啟動成功那麼該Service就會和他所建立的Activity脫離關係,也就是說Service的不會隨著Activity的銷燬而銷燬,並且在應用的任何Activiy中都可以對該Service進行操作。通過以下demo進行說明

(1)建立一個Service類,並在生命週期方法中輸出日誌:

public class MyService extends Service {


    public MyService() {
    }

    @Override
public void onCreate() {
        super.onCreate();
Log.i("MyService", "onCreate: ");
}

    @Override
public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i
("MyService", "onStartCommand: "); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.i("MyService", "onDestroy: "); } }
(2)在SecondActivity中通過StartService的方式啟動,輸出結果為:


(3)退出SecondActivity,在MainActivity中再次啟動Service,輸出結果為:

09-01 10:57:47.729 28261-28261/com.example.mvp.communication I/MyService: onStartCommand:
(4)重新進入到SecondActivity結束Service,輸出結果為:


對比上面結果可以很容易得出:Service在被一個Activity啟動之後,會脫離它所啟動的Activity而存在。

二、Service第二種啟動方式bindService

生命週期:oncreate——>onBind——>unBind——>OnDestroy;多次bindService,oncreate和onBind方法都只會呼叫一次,而且只需要一次呼叫unBindService用於取消bind;

特點說明:它與startService正好相反,一個Activity通過bind的方式啟動Service,那麼該Service是依賴於該Activity存在的,也就是Activity的銷燬也會導致bind所啟動的Service的銷燬(會經歷unbind——>onDestroy的生命週期);相關demo如下:
(1)建立Service,並在Service中定義一個內部類同時繼承Binder,並定義方法test(),該方法可在呼叫bindService的Activity中進行呼叫:

public class MyService extends Service {


    public MyService() {
    }

    @Override
public void onCreate() {
        super.onCreate();
Log.i("MyService", "onCreate: ");
}

    @Override
public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("MyService", "onStartCommand: ");
        return super.onStartCommand(intent, flags, startId);
}

    @Override
public void onDestroy() {
        super.onDestroy();
Log.i("MyService", "onDestroy: ");
}

    @Override
public IBinder onBind(Intent intent) {
        Log.i("MyService", "onBind: ");
        return new MyBinder();
}

    @Override
public boolean onUnbind(Intent intent) {
        Log.i("MyService", "onUnbind: ");
        return super.onUnbind(intent);
}

    class MyBinder extends Binder {
        public void test() {
            Log.i("MyService", "test: ");
}
    }

(2)在SecondActivity中通過bind的方式啟動Service:

public class SecondActivity extends AppCompatActivity {

    private ServiceConnection connection = new ServiceConnection() {
        @Override
public void onServiceConnected(ComponentName name, IBinder binder) {
            ((MyService.MyBinder) binder).test();
}

        @Override
public void onServiceDisconnected(ComponentName name) {

        }
    };
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}

    public void click(View view) {

        Intent intent = new Intent(this, MyService.class);
        switch (view.getId()) {
            case R.id.bind:
                bindService(intent, connection, BIND_AUTO_CREATE);
                break;
            case R.id.unbind:
                unbindService(connection);
                break;
}
    }
}

三、既通過startService啟動也通過bindService的方式進行啟動

同時通過這兩種方式進行啟動,oncreate方法只會呼叫一次,在需要銷燬Service的時候,需要同時呼叫stopService和unBindService(沒有先後順序)。