2013-04-25 49 views
2

我有一個基本活動類來實現所有活動的通用行爲。所有這些擴展了這個BaseActivity。當應用程序轉到後臺時使用公共基本活動停止服務

我綁定到BaseActivity的onStart方法中的服務,並在onStop方法中有條件地解除。有條件地,我的意思是根據用戶選擇的某個選項,當應用程序轉到後臺時,服務應該或不應該在後臺繼續運行。

問題是,有時服務會在不應該運行的時候繼續運行(也就是說,當它的選項被啓用,並且unbindService()被有效地調用時)。

我在想,在每次活動變更時,服務都會被解除綁定。由於綁定的服務是引用計數的,可能我的服務綁定的次數多於未綁定的,所以這就是爲什麼它在最後保持運行的原因,即使我調用unbindService()。

此外,documentation說一些事:

你應該平時配對綁定和解除綁定在客戶生命週期的配套產品啓動,拆除的時刻。例如:

如果您只需要在活動可見的情況下與服務交互,則應在onStart()期間進行綁定,並在onStop()期間進行解除綁定。

如果您希望活動即使在後臺停止時也能收到回覆,那麼您可以在onCreate()期間進行綁定,並在onDestroy()期間進行解除綁定。請注意,這意味着您的活動需要在整個運行期間(即使在後臺運行)使用該服務,因此如果該服務位於另一個進程中,那麼您將增加該進程的權重,並且系統更有可能會殺了它。

由於我試圖實現這兩個選項,應該採取什麼樣的最佳方法來實現呢?

+0

看看我對這個問題的回答(http://stackoverflow.com/questions/10485342/how-to-handle-ipc-between-a-service-and-an-activity-和它的subactivity/10519846#10519846)我認爲這是一個甜心r方法比不斷地綁定/解除綁定 – 2013-04-25 16:14:33

+0

我的回答錯了,請取消選中,以便我可以刪除它。 – 2013-04-26 16:07:47

+0

該「某處」的鏈接是http://developer.android.com/guide/components/services.html – 2013-04-26 16:14:34

回答

0

最後,我改變了我的方法,並決定只使用startService()並使用本地廣播接收器與服務進行通信。

我從onCreate()開始服務並停止在基本活動的onDestroy()方法中。 然後,從服務發送消息到活動中,我使用:

// handler for the events launched by the service 
private BroadcastReceiver mMyServiceReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // Extract data included in the Intent 
     String message = intent.getStringExtra("message"); 
     Log.d(LOG_TAG, "Got message: " + message); 
     // Do stuff... 
    } 
}; 

並登記在該活動的接收機:

private void sendBroadcastMessage(String msg) { 
    Log.d(LOG_TAG, "send broadcast message: " + msg); 
    Intent intent = new Intent(MyService.class.getSimpleName()); 
    // Add data 
    intent.putExtra("message", msg); 
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
} 

然後,爲了在活動通知:

@Override 
public void onResume() { 
    super.onResume(); 

    LocalBroadcastManager.getInstance(this).registerReceiver(mMonitorReceiver, 
      new IntentFilter(MyService.class.getSimpleName())); 
} 
相關問題