270 votes

Notifications de type pousser dans la plateforme Android

Je cherche à écrire une application qui a reçu des alertes poussés d’un serveur. J’ai trouvé quelques méthodes pour ce faire.

  1. SMS - intercepter les SMS entrants et initier une traction à partir du serveur
  2. Interroger le serveur périodiquement

Chacun a ses propres limites. SMS-aucune garantie sur l’heure d’arrivée. Sondage peut vider la batterie.

Avez-vous une meilleure suggestion s’il vous plaît ?. Merci beaucoup.

206voto

BoD Points 3490

La réponse officielle de Google est le <s> Nuage Android appareil Messaging Framework (déconseillée)</s> Google Cloud messagerie

Cela va fonctionner sur Android > = 2.2 (sur les téléphones qui ont le magasin Play).

31voto

dalelane Points 1338

(croix-affichage à partir d'une réponse que j'ai donné à une question similaire, - http://stackoverflow.com/questions/1243066/does-android-support-near-real-time-push-notification/ )

J'ai récemment commencé à jouer avec MQTT http://mqtt.org pour Android comme un moyen de faire ce genre de chose (c'est à dire de notification push qui n'est pas de SMS, mais pilotés par les données, presque immédiat livraison de message, pas d'interrogation, etc.)

J'ai un blog avec des informations de fond sur cette question dans le cas où c'est utile

http://dalelane.co.uk/blog/?p=938

(Note: MQTT est une technologie IBM, et je tiens à signaler que je travaille pour IBM).

20voto

Lalit Points 141

Ma compréhension/l'expérience avec Android notification Push sont-

1. C2DM - GCM Si votre cible plate-forme android est de 2,2+, puis aller pour elle. Juste un hic, l'utilisateur de l'appareil doit toujours être connecté avec un Compte Google pour obtenir les messages.

2. MQTT - Pub/Sub. Besoin d'une connexion active à partir de l'appareil, peut vider la batterie si non mis en œuvre judicieusement.

3. ont également des options comme Diacre , mais ne peut pas être bon dans un long terme à cause du peu de soutien de la communauté.

Edit: 25-NOV-2013

GCM - Google dit..Pour pré-3.0 périphériques, cela oblige les utilisateurs à créer leur compte Google sur leurs appareils mobiles. Un compte Google n'est pas une exigence sur les appareils fonctionnant sous Android 4.0.4 ou plus.

17voto

chiranjib Points 1986

Cloud Android à l'Appareil de Messagerie Cadre

Important: C2DM a été officiellement abandonnée depuis le 26 juin 2012. Cela signifie que C2DM a cessé d'accepter de nouveaux utilisateurs et de quota de demandes. Pas de nouvelles fonctionnalités seront ajoutées à C2DM. Cependant, les applications à l'aide de C2DM va continuer à travailler. Existant C2DM les développeurs sont encouragés à migrer vers la nouvelle version de C2DM, Google Cloud Messaging pour Android (GCM). Voir la C2DM-à-GCM document de Migration pour plus d'informations. Les développeurs doivent utiliser GCM pour les nouveaux développements.

Veuillez consulter le lien suivant:

http://developer.android.com/guide/google/gcm/index.html

17voto

RDC Points 9222

Ici, j'ai écrit quelques étapes pour Obtenir l'Id d'enregistrement et de Notification à partir de zéro

  1. Créer/Enregistrer App sur Google Cloud
  2. Le programme d'installation de Cloud SDK avec le Développement
  3. Configurer le projet pour GCM
  4. Obtenez de l'Appareil d'Enregistrement de l'ID
  5. Envoyer Des Notifications Push
  6. Recevoir Des Notifications Push

Vous pouvez trouver tutoriel complet dans le lien URL ci-dessous

Mise en route avec Android Notification Push : les Dernières versions de Google Cloud Messaging (GCM) - étape par étape tutoriel complet

enter image description here

Capture Code pour obtenir l'Enregistrement de l'ID (Dispositif de Jeton pour le Push Notification).

Configurer le projet pour GCM


Mise à jour du fichier AndroidManifest

Pour activer la GCM, dans notre projet, nous avons besoin d'ajouter quelques permission dans notre fichier de manifeste Aller à AndroidManifest.xml et d'ajouter le code ci-dessous Ajouter La Permission

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

<uses-permission android:name="android.permission.VIBRATE" />

<uses-permission android:name=".permission.RECEIVE" />
<uses-permission android:name="<your_package_name_here>.permission.C2D_MESSAGE" />
<permission android:name="<your_package_name_here>.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

Ajouter GCM Récepteur de Radiodiffusion de la déclaration de

ajouter GCM Récepteur de Radiodiffusion déclaration dans votre balise application

<application
        <receiver
            android:name=".GcmBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" ]]>
            <intent-filter]]>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="" />
            </intent-filter]]>

        </receiver]]>

<application/>

Ajouter GCM Servie déclaration

<application
     <service android:name=".GcmIntentService" />
<application/>

Obtenez de l'Enregistrement de l'ID (Dispositif de Jeton pour le Push Notification)

Maintenant, Allez à votre Lancement/Splash Activité

Ajouter les Constantes et les Variables de Classe

private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
public static final String EXTRA_MESSAGE = "message";
public static final String PROPERTY_REG_ID = "registration_id";
private static final String PROPERTY_APP_VERSION = "appVersion";
private final static String TAG = "LaunchActivity";
protected String SENDER_ID = "Your_sender_id";
private GoogleCloudMessaging gcm =null;
private String regid = null;
private Context context= null;

Mise à jour OnCreate et OnResume méthodes

@Override
protected void onCreate(Bundle savedInstanceState)
{
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_launch);
     context = getApplicationContext();
         if (checkPlayServices()) 
     {
            gcm = GoogleCloudMessaging.getInstance(this);
            regid = getRegistrationId(context);

            if (regid.isEmpty())
            {
                registerInBackground();
            }
            else
            {
            Log.d(TAG, "No valid Google Play Services APK found.");
            }
      }
 }

@Override protected void onResume()
{
       super.onResume();       checkPlayServices();
}


# Implement GCM Required methods (Add below methods in LaunchActivity)

private boolean checkPlayServices() {
        int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
        if (resultCode != ConnectionResult.SUCCESS) {
            if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
                GooglePlayServicesUtil.getErrorDialog(resultCode, this,
                        PLAY_SERVICES_RESOLUTION_REQUEST).show();
            } else {
                Log.d(TAG, "This device is not supported - Google Play Services.");
                finish();
            }
            return false;
        }
        return true;
 }

private String getRegistrationId(Context context) 
{
   final SharedPreferences prefs = getGCMPreferences(context);
   String registrationId = prefs.getString(PROPERTY_REG_ID, "");
   if (registrationId.isEmpty()) {
       Log.d(TAG, "Registration ID not found.");
       return "";
   }
   int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
   int currentVersion = getAppVersion(context);
   if (registeredVersion != currentVersion) {
        Log.d(TAG, "App version changed.");
        return "";
    }
    return registrationId;
}

private SharedPreferences getGCMPreferences(Context context) 
{
    return getSharedPreferences(LaunchActivity.class.getSimpleName(),
                Context.MODE_PRIVATE);
}

private static int getAppVersion(Context context) 
{
     try 
     {
         PackageInfo packageInfo = context.getPackageManager()
                    .getPackageInfo(context.getPackageName(), 0);
            return packageInfo.versionCode;
      } 
      catch (NameNotFoundException e) 
      {
            throw new RuntimeException("Could not get package name: " + e);
      }
}


private void registerInBackground() 
{     new AsyncTask() {
     Override
     protected Object doInBackground(Object... params) 
     {
          String msg = "";
          try 
          {
               if (gcm == null) 
               {
                        gcm = GoogleCloudMessaging.getInstance(context);
               }
               regid = gcm.register(SENDER_ID);               Log.d(TAG, "########################################");
               Log.d(TAG, "Current Device's Registration ID is: "+msg);     
          } 
          catch (IOException ex) 
          {
              msg = "Error :" + ex.getMessage();
          }
          return null;
     }     protected void onPostExecute(Object result) 
     { //to do here };
  }.execute(null, null, null);
}

Note : s'il vous plaît stocker REGISTRATION_KEY, il est important pour l'envoi de PN Message à GCM aussi garder la mienne ce sera unique pour tous les périphériques, à l'aide de cette seule GCM enverra une Notification Push.

Recevoir Des Notifications Push

Ajouter GCM Récepteur de Radiodiffusion de Classe

Comme nous l'avons déjà déclaré "GcmBroadcastReceiver.java" dans notre fichier de Manifeste, Donc permet de créer cette classe mise à jour du récepteur classe code de cette façon

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) 
    {        ComponentName comp = new ComponentName(context.getPackageName(),
                GcmIntentService.class.getName());        startWakefulService(context, (intent.setComponent(comp)));
        setResultCode(Activity.RESULT_OK);
        Toast.makeText(context, "wow!! received new push notification", Toast.LENGTH_LONG).show();
    }
}

Ajouter GCM Classe de Service

Comme nous l'avons déjà déclaré "GcmBroadcastReceiver.java" dans notre fichier de Manifeste, Donc permet de créer cette classe mise à jour du récepteur classe code de cette façon

public class GcmIntentService extends IntentService
{     public static final int NOTIFICATION_ID = 1;     private NotificationManager mNotificationManager;     private final static String TAG = "GcmIntentService";     public GcmIntentService() {
     super("GcmIntentService");     
     }     @Override
     protected void onHandleIntent(Intent intent) {
          Bundle extras = intent.getExtras();
          Log.d(TAG, "Notification Data Json :" + extras.getString("message"));

          GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
          String messageType = gcm.getMessageType(intent);          if (!extras.isEmpty()) {          if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR
               .equals(messageType)) {
               sendNotification("Send error: " + extras.toString());
          } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED
          .equals(messageType)) {
          sendNotification("Deleted messages on server: "
          + extras.toString());          // If it's a regular GCM message, do some work.
          } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE
          .equals(messageType)) {
          // This loop represents the service doing some work.
          for (int i = 0; i < 5; i++) {
               Log.d(TAG," Working... " + (i + 1) + "/5 @ "
               + SystemClock.elapsedRealtime());               try {
                    Thread.sleep(5000);
               } catch (InterruptedException e) {
               }
             }
             Log.i(TAG, "Completed work @ " + SystemClock.elapsedRealtime());
             sendNotification(extras.getString("message"));
           }
        }        // Release the wake lock provided by the WakefulBroadcastReceiver.
        GcmBroadcastReceiver.completeWakefulIntent(intent);
     }     // Put the message into a notification and post it.
     // This is just one simple example of what you might choose to do with
     // a GCM message.
     private void sendNotification(String msg) {          mNotificationManager = (NotificationManager) this
          .getSystemService(Context.NOTIFICATION_SERVICE);
          PendingIntent contentIntent = PendingIntent.getActivity(this, 0,          new Intent(this, LaunchActivity.class), 0);

          NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(          this)
          .setSmallIcon(R.drawable.icon)
          .setContentTitle("Ocutag Snap")
          .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
          .setContentText(msg)
          .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);

          mBuilder.setContentIntent(contentIntent);          mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
     }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X