1. 程式人生 > >Android Service 兩種啟動方式

Android Service 兩種啟動方式

1.Context.startService()方式啟動 

①Context.startService()方式的生命週期: 啟動時,startService –> onCreate() –> onStart()停止時,stopService –> onDestroy()如果呼叫者直接退出而沒有停止Service,則Service 會一直在後臺執行 Context.startService()方法啟動服務,在服務未被建立時,系統會先呼叫服務的onCreate()方法,接著呼叫onStart()方法。如果呼叫startService()方法前服務已經被建立,多次呼叫startService()方法並不會導致多次建立服務,但會導致多次呼叫onStart()方法。採用startService()方法啟動的服務,只能呼叫Context.stopService()方法結束服務,服務結束時會呼叫onDestroy()方法附程式碼

2.Context.bindService()方式啟動:①Context.bindService()方式的生命週期: 繫結時,bindService -> onCreate() –> onBind()呼叫者退出了,即解繫結時,Srevice就會unbindService –>onUnbind() –> onDestory()Context.bindService()方式啟動 Service的方法:繫結Service需要三個引數:bindService(intent, conn, Service.BIND_AUTO_CREATE);第一個:Intent物件第二個:ServiceConnection物件,建立該物件要實現它的onServiceConnected()和 onServiceDisconnected()來判斷連線成功或者是斷開連線第三個:如何建立Service,一般指定繫結的時候自動建立附程式碼

  1. package com.dada.test;  
  2. import android.app.Activity;  
  3. import android.content.ComponentName;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.content.ServiceConnection;  
  7. import android.os.Bundle;  
  8. import android.os.IBinder;  
  9. import android.util.Log;  
  10. import
     android.view.View;  
  11. import android.widget.Button;  
  12. import com.dada.test.BindService.MyBinder;  
  13. publicclass TestActivity extends Activity {  
  14.     privateboolean flag;  
  15.     privatestaticfinal String TAG = "TestActivity";  
  16.     /** Called when the activity is first created. */
  17.     @Override
  18.     publicvoid onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.main);  
  21.         super.onCreate(savedInstanceState);   
  22.         setContentView(R.layout.main);   
  23.         Button btnStart = (Button) findViewById(R.id.btnStart);   
  24.         Button btnStop = (Button) findViewById(R.id.btnStop);   
  25.         btnStart.setOnClickListener(new View.OnClickListener() {   
  26.             @Override
  27.             publicvoid onClick(View v) {   
  28.                 //啟動service 方式2
  29.                 bindService();  
  30.             }   
  31.         });   
  32.         btnStop.setOnClickListener(new View.OnClickListener() {   
  33.             @Override
  34.             publicvoid onClick(View v) {   
  35.  //停止service 方式2
  36.                 unBindService();  
  37.             }   
  38.         });   
  39.     }  
  40.     //啟動service 方式2
  41.     //
  42.     privatevoid bindService(){  
  43.         Intent intent = new Intent(TestActivity.this,BindService.class);  
  44.         Log.i(TAG, "bindService()");  
  45.         bindService(intent, conn, Context.BIND_AUTO_CREATE);  
  46.     }  
  47.     privatevoid unBindService(){  
  48.         Log.i(TAG, "unBindService() start....");  
  49.         if(flag == true){  
  50.             Log.i(TAG, "unBindService() flag");  
  51.             unbindService(conn);  
  52.             flag = false;  
  53.         }  
  54.     }  
  55. private ServiceConnection conn = new ServiceConnection() {  
  56.         @Override
  57.         publicvoid onServiceDisconnected(ComponentName name) {  
  58.             // TODO Auto-generated method stub
  59.             Log.i(TAG, "onServiceDisconnected()");  
  60.         }  
  61.         @Override
  62.         publicvoid onServiceConnected(ComponentName name, IBinder service) {  
  63.             // TODO Auto-generated method stub
  64.             Log.i(TAG, "onServiceConnected()");  
  65.             MyBinder binder = (MyBinder)service;  
  66.             BindService bindService = binder.getService1();  
  67.             bindService.MyMethod();  
  68.             flag = true;  
  69.         }  
  70.     };  
  71. }  

service

  1. package com.dada.test;  
  2. import android.app.Service;  
  3. import android.content.Intent;  
  4. import android.os.Binder;  
  5. import android.os.IBinder;  
  6. import android.util.Log;  
  7. publicclass BindService extends Service {  
  8.     privatestaticfinal String TAG = "BindService";  
  9.     private MyBinder myBinder = new MyBinder();  
  10.     publicvoid MyMethod(){  
  11.         Log.i(TAG, "BindService-->MyMethod()");  
  12.     }  
  13.     @Override
  14.     public IBinder onBind(Intent intent) {  
  15.         Log.i(TAG, "BindService-->onBind()");  
  16.         return myBinder;  
  17.     }  
  18.     publicclass MyBinder extends Binder{  
  19.         public BindService getService1(){  
  20.             return BindService.this;  
  21.         }  
  22.     }  
  23.     @Override
  24.     publicvoid onCreate() {  
  25.         Log.i(TAG, "BindService-->onCreate()");  
  26.         super.onCreate();  
  27.     }  
  28.     @Override
  29.     publicvoid onStart(Intent intent, int startId) {  
  30.         Log.i(TAG, "BindService-->onStart()");  
  31.         super.onStart(intent, startId);  
  32.     }  
  33.     @Override
  34.     publicvoid onDestroy() {  
  35.         Log.i(TAG, "BindService-->onDestroy()");  
  36.         super.onDestroy();  
  37.     }  
  38.     @Override
  39.     publicboolean onUnbind(Intent intent) {  
  40.         Log.i(TAG, "BindService-->onUnbind()");  
  41.         returnsuper.onUnbind(intent);  
  42.     }  
  43. }  

執行日誌

點選啟動


點選停止


沒有打出onServiceDisconnected的日誌的原因:

注:SDK上是這麼說的:This is called when the connection with the service has been 
unexpectedly disconnected -- that is, its process crashed. Because it is running in our same 
process, we should never see this happen.

所以說,只有在service因異常而斷開連線的時候,這個方法才會用到

其他

由於Service 的onStart()方法只有在startService()啟動Service的情況下才呼叫,故使用onStart()的時候要注意這點。

與 Service 通訊並且讓它持續執行

      如果我們想保持和 Service 的通訊,又不想讓 Service 隨著 Activity 退出而退出呢?你可以先 startService() 然後再 bindService() 。當你不需要繫結的時候就執行 unbindService() 方法,執行這個方法只會觸發 Service 的 onUnbind() 而不會把這個 Service 銷燬。這樣就可以既保持和 Service 的通訊,也不會隨著 Activity 銷燬而銷燬了。