Android Google Cloud Messaging

Google Cloud Messaging(GCM) este un serviciu free pus la dispoziție de Google care permite dezvoltatorilor să trimită date de la un server către aplicațiile instalate pe diferite device-uri.

gcm-logo

De aici derivă și termenul de Push notification, prin intermediul căruia userul este anunțat de anumite modificări. GCM elimină cererile repetate la server și astfel salvează bateria telefonului și consumul de date. Un alt avantaj e reprezentat de faptul că deși telefonul nu a avut o perioadă lungă de timp conexiune la internet, imediat ce acesta este conectat la wifi sau 3g notificările trimise anterior vor fi primite. Există însă și riscul ca mesajul să nu ajungă la timp sau chiar să nu ajungă deloc, însă acest eveniment nefericit se întâmplă destul de rar.

GCM a fost lansat la Google IO în anul 2012 și vine să înlocuiască C2DM(Cloud to Device Messaging),  însă Google pune la dispoziție posibilitatea de portare a aplicațiilor realizate cu vechiul serviciu, iar modificările, cel puțin la nivel de client sunt foarte simple.

Cum funcționează?

Mai întâi device-ul trebuie să se înregistreze: device-ul trimite la GCM request pentru a se înregistra, apoi GCM trimite către device un registration id care va fi trimis către server pentru a avea o evidență a device-urilor înregistrate. Apoi între server și GCM au loc schimburi de mesaje, iar GCM le trimite către device.

magda_badita_gcm_registration

magda_badita_gcm_sending

Cum îl putem utiliza în proiectele noastre?

Etapa 1: Google API Console

  1. Mai întâi este necesar să avem un cont de gmail, după care trebuie realizat un proiect nou în Google API Cosole.
  2. Click Create project
  3. Enable GCM Service

  4. Salvează API Key și projectID

google_api

api_keys

Etapa 2: Implementare Client Android

  1. Copiază gcm.jar în folderul lib din proiect.
  2. Implementează main activity 
    import com.google.android.gcm.GCMRegistrar;
    GCMRegistrar.checkDevice(this);
    GCMRegistrar.checkManifest(this);
    final String regId = GCMRegistrar.getRegistrationId(this);
    if (regId.equals("")) {
    GCMRegistrar.register(this, SENDER_ID);
    } else {
    Log.v(TAG, "Already registered");
    }
    
  3. Implementează clasa my_app_package.GCMIntentService 
    <code>
    public class GCMIntentService extends GCMBaseIntentService {
        public static String TAG = "GCMIntentService";
        public GCMIntentService(String senderId) {
            super(senderId);
            Log.d("GCMIntentService", senderId);
        }
        @Override
        protected void onError(Context arg0, String arg1) {
            Log.d("onError", arg1);
        }
        @Override
        protected boolean onRecoverableError(Context context, String errorId){
            Log.d("onRecoverableError", errorId);
            return false;
        }
        @Override
        protected void onMessage(Context arg0, Intent arg1) {
            Log.d("onMessage", String.valueOf(arg1));
        }
        @Override
        protected void onRegistered(Context arg0, String arg1) {
            Log.d("onRegistered", arg1);
        }
        @Override
        protected void onUnregistered(Context arg0, String arg1) {
            Log.d("onUnregistered", arg1);
        }
    }</code>
    
  4. Adaugă următoarele secvențe în AndroidManifest.xml 
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="xx"/>
<permission android:name="my_app_package.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="my_app_package.permission.C2D_MESSAGE" />
<!-- App receives GCM messages. -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<!-- GCM connects to Google Services. -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- GCM requires a Google account. -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="my_app_package" />
</intent-filter>
</receiver>
<service android:name=".GCMIntentService" />

 Etapa 3: Portare C2DM – GCM

La nivel de client modificarea este foarte simplă:

Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0));
registrationIntent.putExtra("sender", senderID);
startService(registrationIntent);
Advertisements
Android Google Cloud Messaging

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s