广播接收器和服务

时间:2014-08-31 15:54:27

标签: android

我在应用程序上工作,它将通过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条服务将开始工作。 我的解释是否正确?如果是的话我该怎么办?

2 个答案:

答案 0 :(得分:0)

事实并非如此,只会启动一项服务。 正如文档所述,startWakefulService()执行context.startService(),其中声明:

  

如果此服务尚未运行,它将被实例化并启动(如果需要,为其创建一个进程);如果它正在运行,那么它仍然在运行。

所以基本上只有在服务尚不存在的情况下才会创建服务。文档还声明新的意图将被传递给调用其onStartCommand()的现有服务。

所以是的,你应该按照自己的方式做到这一点,只使用一种服务!

文档:

context.startService()

startWakefulService()

答案 1 :(得分: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);

来自文档:

  

"服务根据需要启动,使用工作线程依次处理每个Intent,并在失去工作时自行停止"

因此,从我可以收集的信息中,将GCM消息放入数据库后,服务将自行停止。

可以找到文档here