Service及Service與Activity通訊

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.