2012-09-07 45 views
3

我很新的Android開發人員,並與何時可以在Android Activity生命週期中調用綁定服務?

我在活動

startService(intent); 
bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 

mConnectiononCreate方法結合的服務活動的綁定服務的概念掙扎是一個ServiceConnection對象我已經覆蓋了onServiceConnected回調方法在一個匿名類

在回調,mService(這是LibraryService類型的一個類的成員,LibraryService是我的Service子類)設置爲引用的LibraryService對象,我們結合:

mService = binder.getService(); 

我認爲在的onCreate調用bindService後,我會再能夠調用通過MSERVICE參考LibraryService,但它是此時仍設置爲null,表示onServiceConnected回調尚未執行。

我試圖打印使用登錄由mService方法生成的字符串的值:

if (mService != null) { 
    Log.d(LOG_TAG, "In onCreate getLogFileName string value: " + mService.getLogFileName("pulse"));    
} else { 
    Log.d(LOG_TAG, "In onCreate getLogFileName string value: null");     
} 

正如我所提到 - 它仍然在的onCreate空,我然後加入相同的日誌的代碼來調用onStart和onResume但mService仍爲空

我的問題是什麼時候該回調得到執行?我原以爲它必須發生在onCreate方法的內部,但顯然不是。我想我需要在Android系統執行回調的方式/時間方面需要一些指示器

我知道回調得到執行,因爲我在語句中放置了一個斷點,其中mService被實例化並且它碰到該語句。我只是不明白什麼時候發生,即如何知道何時可以假設mService已被設置?我只能在OnServiceConnected回調的主體中訪問它嗎?

回答

2

服務綁定是異步的,因此您必須通過一點同步來處理這個問題。 因此,在調用bind服務後,你可以不喜歡

synchronized(this){ 
    while(mBoundInstance == null) 
     this.wait(); 
} 
在onServiceConnected

synchronized(this){ 
    this.notify(); //wakes up thread: now mBoundInstance is 100% != null 
} 

注意,好把在那的AsyncTask等,使用戶界面不會被凍結。

+0

這看起來像一些非常基本的東西,我應該理解 - 這是一個java廣泛的東西或特定於android(我正在考慮什麼谷歌fid幾個入門教程) – bph

+1

這是純java:你可以直接看java官方教程,併發部分。 http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html – user1610075