2014-08-31 231 views
0

我正在開發一個應用程序,它將通過GCM接收大量消息。廣播接收器和服務

我創建廣播接收機即卡拉斯像這樣

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver { 

      public void onReceive(Context context, Intent intent) { 
       ComponentName comp = new ComponentName(context.getPackageName(), MyIntentService.class.getName()); 
       startWakefulService(context, (intent.setComponent(comp))); 
       setResultCode(Activity.RESULT_OK); 
      } 
} 

然後MyIntentService將調用處理程序保存消息在DB的意圖。

一切工作正常,我的問題是這樣的,它可以做上面顯示的是什麼?我在Android上有2個月的歷史,但是上面看起來像每次有新消息時都會創建一個服務,例如,如果同時收到20個GCM消息,那麼這意味着20個服務將開始工作。 我的解釋是否正確?如果是,我該怎麼辦?

回答

0

實際上並非如此,只有一項服務將啓動。 如上所述由文檔startWakefulService()執行context.startService(),它規定:

如果該服務尚未運行,它將會被實例化,並開始(如果需要爲它創造的過程);如果它正在運行,那麼它仍然在運行。

所以基本上只有一個服務不存在時纔會被創建。該文檔還聲明新的意圖將被傳遞給調用onStartCommand()的現有服務。

所以,你應該沒問題,就像你唯一使用一種服務一樣!

文檔:

context.startService()

startWakefulService()

+0

在這種情況下,我可以讓服務黏性?這樣它就會在那裏,並且將接收來自BroadcastReceiver的消息。 – 2014-08-31 18:03:15

+0

或者當接收到新消息時,它是否更好地綁定它? – 2014-08-31 18:11:51

0

如果您MyIntentService正在擴大IntentService,那麼你應該做的是釋放正在使用舉行之後鎖定了以下內容:

@Override 
protected void onHandleIntent(Intent intent) { 
    Bundle extras = intent.getExtras(); 

    // ADD YOUR GCM TO THE DB HERE, THEN RELEASE THE WAKE LOCK 
    GcmBroadcastReceiver.completeWakefulIntent(intent); 

來自文檔:

「根據需要啓動該服務,處理使用一個工作線程按順序將每意圖,當它運行的工作停止本身」

所以從我所知,該服務將停止本身將GCM消息放入數據庫之後。

文檔可以發現here