2014-08-31 173 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