Service——服務。
一:它在後台運行,是不可互動的。層級跟Activity差不多,但是他不能自己運行,需要通過某一個Activity或者其他Context對象來調用。
如:Context.startService()和Context.bindServiece()兩種方式啟動service
如果在Service的onCreaete()或者onStart()裡面有一些很耗時間的操作,最好啟動一個新的線程來運行它。
如果Service是運行在主線程中,會影響到程式的UI操作或阻塞主線程的其他事情
應用情境如:
檢測SD卡上的檔案變化、或者後台記錄使用者地理位置資訊的變化
1:Local Service——本應用程式的Service
2:操作別的應用程式的Service(需要涉及IPC)
二:兩種方法啟動Service:分別是start和bind
一個服務只會建立一次,銷毀一次,但可以開始多次,因此,onCreate和onDestroy方法只會被調用一次,而onStart方法會被調用多次。
Service的生命週期
1:通過startService啟動
Service啟動的時候會經曆產生——>開始(onCreate()——>onStart())過程,Service停止時,直接進入銷毀過程(onDestroy)。
而如果是調用者(TestServiceHolder)自己退出而沒有調用stopService,Service會一直在後台運行。直到下次調用者(TestServiceHolder)再次啟動,
並明確調用stopService
2:通過bindService
提供bindService啟動Service,只會運行onCreate(),這個時候將調用者(TestServiceHolder)和TestService綁定在一起,
如果調用者(TestServiceHolder)退出了,TestService就會調用onUnbind——>onDestroy()。所謂綁定就是共存亡。
要是這幾個方法交織在一起,會如何呢?
一個原則是:Service的onCreate的方法只會被調用一次,就是無論多少次的綁定和啟動,Service只被建立一次。
如果是先綁定了(bind),那麼啟動(start)的時候就直接運行Service的onStart方法
如果是先啟動(start),那麼綁定(bind)的時候就直接運行onBind 方法
如果先綁定了,就停止不掉了,也就是stopService不能用了。要先UnbindService,再StopService——區別
在android中Activity負責前台介面展示,service負責背景需要長期啟動並執行任務。Activity和Service之間的通訊主要由IBinder負責。在需要和Service通訊的Activity中實現ServiceConnection介面,並且實現其中的onServiceConnected和onServiceDisconnected方法。然後在這個Activity中還要通過如下代碼綁定服務:
Intent intent = new Intent().setClass( this , IHRService.class );bindService( intent , this , Context.BIND_AUTO_CREATE );
當調用bindService方法後就會回調Activity的onServiceConnected,在這個方法中會向Activity中傳遞一個IBinder的執行個體,Acitity需要儲存這個執行個體。代碼如下:
public void onServiceConnected( ComponentName inName , IBinder serviceBinder) { if ( inName.getShortClassName().endsWith( "IHRService" ) ) { try { this.serviceBinder= serviceBinder; mService = ( (IHRService.MyBinder) serviceBinder).getService(); //mTracker = mService.mConfiguration.mTracker; } catch (Exception e) {} }}
在Service中需要建立一個實現IBinder的內部類(這個內部類不一定在Service中實現,但必須在Service中建立它)。
public class MyBinder extends Binder {//此方法是為了可以在Acitity中獲得服務的執行個體 public IHRService getService() { return IHRService.this; }//這個方法主要是接收Activity發向服務的訊息,data為發送訊息時向服務傳入的對象,replay是由服務返回的對象 public boolean onTransact( int code , Parcel data , Parcel reply , int flags ) { //called when client calls transact on returned Binder return handleTransactions( code , data , reply , flags ); }}
然後在Service中建立這個類的執行個體:
public IBinder onBind( Intent intent ) { IBinder result = null; if ( null == result ) result = new MyBinder() ; return result;}
這時候如果Activity向服務發送訊息,就可以調用如下代碼向服務端發送訊息:
inSend = Parcel.obtain();serviceBinder.transact( inCode , inSend , null , IBinder.FLAG_ONEWAY );
這種方式是只向服務端發送訊息,沒有傳回值的。如果需要從服務端返回某些值則可用如下代碼:
result = Parcel.obtain();serviceBinder.transact( inCode , inSend , result , 0 );return result;
發送訊息後IBinder介面中的onTransact將會被調用。在服務中如果有結果返回(比如下載資料)則將結果寫入到result參數中。在Activity中從result中讀取服務執行的結果。
上面只是描述了如何由Acitity向Service發送訊息,如果Service向Activity發送訊息則可藉助於BroadcastReceiver實現。
from : http://www.cnblogs.com/mumue/archive/2012/05/15/2501931.html