使用GCM服务在2个应用程序之间进行通信

时间:2013-02-20 18:19:53

标签: java google-cloud-messaging

我正在尝试创建2个通过GCM服务进行通信的应用程序。 我们假设我正在尝试将应用程序A中的字符串发送到B,然后从B发送到A.

我对GCM服务很新,我有点困惑。每当你看到myApiCode时,我用我的原始代码用api代码替换它。这是A代码:

public class MainActivity extends Activity 
{
    private final String myApiKey = "903137756997";
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        GCMRegistrar.checkDevice(this);
        GCMRegistrar.checkManifest(this);
        final String regId = GCMRegistrar.getRegistrationId(this);
        if (regId.equals("")) {
          GCMRegistrar.register(this, "myApiCode");
        } else {
          Log.v("INFORMATION", "Already registered");
        }


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}

这是GCMIntentService:

public class GCMIntentService extends GCMBaseIntentService
{
    private final String myApiKey = "903137756997";

    public GCMIntentService()
    {
        super("123");
    }
            ...
    @Override
    protected void onMessage(Context arg0, Intent arg1) 
    {
        Log.d("GCM", "RECIEVED A MESSAGE");
        System.out.println("123123123123");
    }
            ...

}

我附加的代码是应用A,现在我将附上应用B的代码:

以下代码是从主要活动调用的服务:

public void onCreate()
{
    super.onCreate();

    Sender sender = new Sender(myApiKey);
    Message message = new Message.Builder().build();
    Result result = null;
    try {
        result = sender.send(message, "123", 5);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    if (result.getMessageId() != null) {
         String canonicalRegId = result.getCanonicalRegistrationId();
         if (canonicalRegId != null) {
           // same device has more than on registration ID: update database
         }
        } else {
         String error = result.getErrorCodeName();
         if (error.equals(Constants.ERROR_NOT_REGISTERED)) {
           // application has been removed from device - unregister database
         }
        }
}

我必须提到两个应用程序都运行没有异常,但看起来没有任何反应。我想我的密钥有问题,因为我仍然无法理解应用程序B将如何找到应用程序A.

1 个答案:

答案 0 :(得分:1)

您必须覆盖GCMIntentService中的onRegistered方法。当GCM服务器返回您对GCMRegistrar.register的调用提示的注册ID时,将调用此方法。

此方法的实现应将String参数上传到您控制的服务器,然后服务器可以发送针对您上传的ID的消息。

此外,您不应该以这种方式直接在应用之间推送消息,因为它需要您在应用包中发送私有API密钥才能发送消息。