如何从GCMIntent服务获取GCM注册ID到我的MainActivity?

时间:2013-05-12 12:34:32

标签: android push-notification google-cloud-messaging

我正在开发一个Android应用程序,我在其中使用GCM进行推送通知。我有一个MainActivity我尝试在onCreate()方法中注册以下设备。

        String regId = GCMRegistrar.getRegistrationId(this);
        if (regId.equals("")) 
        {
        GCMRegistrar.register(this, "My sender id");        
        }
        else
        {
            GCMIntentService.received=true;

        }

        while(!GCMIntentService.received)
        {
            Log.i("RegisterLocation","waiting...... for registartion id");

        }

我无法在MainActivity中获取注册用户ID,但控件将转到OnRegistered(context,String)类中的GCMIntentService函数,该类是GCMBaseIntentService的子类,当设备已注册。 我也可以在日志中打印注册ID。

@Override
protected void onRegistered(Context context, String registrationId) 
{
    received=true;
    Log.i(TAG, "Device registered: regId = " + registrationId);
}

由于GCM需要一些时间来注册设备,我写了一个循环来测试设备是否已注册。但那个循环是一个无限循环。我也试过了Thread.sleep()。我希望该注册ID存储在我的本地服务器中 任何人都可以提出一个解决方案来获取MainActivity中的注册ID吗?

2 个答案:

答案 0 :(得分:0)

我建议你在Service课程中完成所有操作。

GCMIntentService收到注册ID后,请致电service

我做了同样的事情并且运作顺利..

快乐编码:)

答案 1 :(得分:0)

我还建议您使用onRegistered方法在服务器中存储注册ID的所有逻辑,而不是主要活动。

你的循环不起作用的原因与Java memory model

有关
  

重要的是要注意Thread.sleep和Thread.yield都没有   有任何同步语义。特别是编译器   不必将寄存器中缓存的写入刷新到共享内存   在调用Thread.sleep或Thread.yield之前,编译器也没有   在调用Thread.sleep之后,必须重新加载缓存在寄存器中的值   或Thread.yield。

     

例如,在下面(破碎的)代码片段中,假设   this.done是一个非易失性布尔字段:

 while (!this.done)
     Thread.sleep(1000);
  

编译器可以自由阅读this.done字段一次,并重用   每次执行循环时的缓存值。这意味着   循环永远不会终止,即使另一个线程改变了   this.done的值

此示例中的this.done字段与GCMIntentService.received的行为相同。如果你使它变得不稳定它应该工作。也就是说,我不建议在你的主要活动中使用那个循环。