2014-07-08 2 views
0

J'essaie de faire une application de notification push. J'ai suivi le blog de Ravi Tamada pour cette http://www.androidhive.info/2012/10/android-push-notifications-using-google-cloud-messaging-gcm-php-and-mysql/ je ne comprenais pas le flux de l'une des classes ..Essayer de comprendre le flux d'un programme

classes est la suivante ..

public class InitialActivity extends Activity { 
// label to display gcm messages 
TextView lblMessage; 

// Asyntask 
AsyncTask<Void, Void, Void> mRegisterTask; 

// Alert dialog manager 
AlertDialogManager alert = new AlertDialogManager(); 

// Connection detector 
ConnectionDetector cd; 

public static String name; 
public static String email; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main_pn); 

    cd = new ConnectionDetector(getApplicationContext()); 

    // Check if Internet present 
    if (!cd.isConnectingToInternet()) { 
     // Internet Connection is not present 
     alert.showAlertDialog(InitialActivity.this, 
       "Internet Connection Error", 
       "Please connect to working Internet connection", false); 
     // stop executing code by return 
     return; 
    } 

    // Getting name, email from intent 
    Intent i = getIntent(); 

    name = i.getStringExtra("name"); 
    email = i.getStringExtra("email");  

    // 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. 
    GCMRegistrar.checkManifest(this); 

    lblMessage = (TextView) findViewById(R.id.lblMessage); 

    registerReceiver(mHandleMessageReceiver, new IntentFilter(
      DISPLAY_MESSAGE_ACTION)); 

    // Get GCM registration id 
    final String regId = GCMRegistrar.getRegistrationId(this); 

    // Check if regid already presents 
    if (regId.equals("")) { 
     // Registration is not present, register now with GCM 
     lblMessage.append("inside first if condition where regid = null" + "\n\n"); 
     GCMRegistrar.register(this, SENDER_ID); 
    } else { 
     // Device is already registered on GCM 
     if (GCMRegistrar.isRegisteredOnServer(this)) { 
      // Skips registration.    
      Toast.makeText(getApplicationContext(), "Already registered with GCM", Toast.LENGTH_LONG).show(); 
     } 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. 
      lblMessage.append("inside 2nd if condition where regid != null and GCMRegistrar.isRegisteredOnServer(this) = false " + "\n"); 
      final Context context = this; 
      mRegisterTask = new AsyncTask<Void, Void, Void>() { 

       @Override 
       protected Void doInBackground(Void... params) { 
        // Register on our server 
        // On server creates a new user 
        lblMessage.append("inside doinbackground" + "\n\n"); 
        ServerUtilities.register(context, name, email, regId); 
        return null; 
       } 

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

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

/** 
* Receiving push messages 
* */ 
private final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     lblMessage.append("inside BroadcastReceiver mHandleMessageReceiver " + "\n\n"); 
     String newMessage = intent.getExtras().getString(EXTRA_MESSAGE); 
     // Waking up mobile if it is sleeping 
     WakeLocker.acquire(getApplicationContext()); 

     /** 
     * Take appropriate action on this message 
     * depending upon your app requirement 
     * For now i am just displaying it on the screen 
     * */ 

     // Showing received message 
     lblMessage.append(newMessage + "\n\n");   
     Toast.makeText(getApplicationContext(), "New Message: " + newMessage, Toast.LENGTH_LONG).show(); 
     // From Demo Server: successfully added device! 
     // Releasing wake lock 
     WakeLocker.release(); 
    } 
}; 

@Override 
protected void onDestroy() { 
    if (mRegisterTask != null) { 
     mRegisterTask.cancel(true); 
    } 
    try { 
     lblMessage.append("onDestroy " + "\n"); 
     unregisterReceiver(mHandleMessageReceiver); 
     GCMRegistrar.onDestroy(this); 
    } catch (Exception e) { 
     Log.e("UnRegister Receiver Error", "> " + e.getMessage()); 
    } 
    super.onDestroy(); 
} 

}

maintenant sa sortie est comme suit

le programme entre dans le récepteur de diffusion 3 fois .. comment cela se produit-il? J'ai appliqué le même code à une autre application, mais le code entré récepteur récepteur une seule fois .. alors qu'est-ce qui se passe ??

+0

Vous pourriez demander à Ravi Tamada, quel qu'il soit –

+0

@Alex je l'ai fait .. pas de réponse .. et j'ai un peu besoin de toute urgence .. – user3214173

+0

Je suggère que plutôt que d'utiliser ce blog (qui n'est pas très récent), vous utiliser la démo officielle actuelle pour GCM. Vous pouvez le trouver [ici] (https://code.google.com/p/gcm/source/browse/gcm-client/GcmClient/src/main/). – Eran

Répondre

0

Les commentaires disent tout. En regardant le code au début, vous allez vérifier la connexion Internet. Deuxièmement, une fois qu'il est coché, vous allez enregistrer le récepteur pour recevoir les messages GCM. Vous allez d'abord essayer d'obtenir l'identifiant d'enregistrement du serveur GCM pour votre appareil. Si vous n'êtes pas enregistré (pour lequel vous obtiendrez ""), essayez d'enregistrer votre appareil dans le serveur GCM, ce qui est important pour obtenir des messages GCM. Une fois enregistré pour ce projet d'application (pour lequel vous n'obtiendrez aucun identifiant), essayez de vous enregistrer sur votre serveur car votre serveur doit avoir un identifiant unique de votre mobile pour envoyer des messages GCM. Receiver doit recevoir les messages provenant de GCM. C'est ce que dit tout le code. Pour le code étape par étape, désolé. Vous devez au moins faire des efforts pour cela.

+0

ok je suis d'accord .. mais ce que je ne comprends pas, c'est le récepteur est toujours à l'écoute .. donc même si le code est fourni dans une application différente, il devrait fonctionner ?? ryt ?? – user3214173

+0

Si le récepteur doit répondre pour toute la diffusion alors toute l'application aurait répondu pour toute la diffusion (comme WhatsApp alerte pour la demande d'ami Facebook.: P. Just blague). Je suppose que vous devez lire plus attentivement la documentation du GCM. – user1728071

+0

. Ce code permettra à votre application de répondre à un message particulier envoyé par votre GCM. C'est de votre application. – user1728071