2013-02-22 51 views
1

在服務器端,我發現一臺設備有多個註冊ID,這顯然會造成很多問題。像收到很多次的消息。GCM中服務器端的多個應用程序ID

我怎麼能得到舊的註冊ID紅色,或確保註冊沒有發生,如果有一個有效的註冊ID。

我跟隨在Android文檔的實例教程的時候我寫了下面我的應用程序:

checkNotNull(SERVER_URL, "SERVER_URL"); 
      checkNotNull(SENDER_ID, "SENDER_ID"); 
      // Make sure the device has the proper dependencies. 
      GCMRegistrar.checkDevice(this); 
      // Make sure the manifest was properly set - comment out this line 
      // while developing the app, then uncomment it when it's ready. 
      // NOT required any more GCMRegistrar.checkManifest(this); 

      /** 
      * this code to register reciver moved to message actvity 
      */ 
      //registerReceiver(mHandleMessageReceiver, new IntentFilter(
      //  DISPLAY_MESSAGE_ACTION)); 


      /* final String */regId = GCMRegistrar.getRegistrationId(this); 

      /** 
      * save regId in pref to be used by Location update service 
      */ 
      SavePreferences("regId", regId); 

      if (regId.equals("")) { 
       // Automatically registers application on startup. 
       GCMRegistrar.register(this, SENDER_ID); 
      } else { 
       // Device is already registered on GCM, check server. 
       if (GCMRegistrar.isRegisteredOnServer(this)) { 
        ;; 
        // Skips registration. 
        // -- mDisplay.append(getString(R.string.already_registered) + 
        // "\n"); 
       // System.out.println(getString(R.string.already_registered) 
        //  + "\n"); 

       } else { 
        // Try to register again, but not in the UI thread. 
        // It's also necessary to cancel the thread onDestroy(), 
        // hence the use of AsyncTask instead of a raw thread. 
        final Context context = this; 
        mRegisterTask = new AsyncTask<Void, Void, Void>() { 

         @Override 
         protected Void doInBackground(Void... params) { 
          boolean registered = ServerUtilities.register(context, 
            regId); 
          // At this point all attempts to register with the app 
          // server failed, so we need to unregister the device 
          // from GCM - the app will try to register again when 
          // it is restarted. Note that GCM will send an 
          // unregistered callback upon completion, but 
          // GCMIntentService.onUnregistered() will ignore it. 
          if (!registered) { 
           GCMRegistrar.unregister(context); 
          } 
          return null; 
         } 

         @Override 
         protected void onPostExecute(Void result) { 
          mRegisterTask = null; 
         } 

        }; 
        mRegisterTask.execute(null, null, null); 
       } 
      } 

回答

2
Please refer link: http://stackoverflow.com/questions/15030233/gcm-multiple-application-id-in-server-side/15030465#comment21123039_15030465 

Also check canonical registration ids concept :http://developer.android.com/google/gcm/adv.html 

or 

when a new id is generated you will try to register it GCM registrar. when this new registration id successfully register your onRegister() method of service will be called . 

here you can add code to replace previous one with new one.but for this along with registration id you need to send some unique reference to server,so for next time you can check this unique reference and replace existing registration id with new one 

checked following code: 

@Override 

protected void onRegistered(Context context, String registrationId) { 

ServiceUtilities.register(context, registrationId); 
//call service and replace id 
} 
相關問題