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(2)在SecondActivity中通過StartService的方式啟動,輸出結果為:("MyService", "onStartCommand: "); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.i("MyService", "onDestroy: "); } }
(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(沒有先後順序)。