Push-уведомления на платформе Android


Я ищу, чтобы написать приложение, которое получает толкнул оповещения от сервера. Я нашел несколько способов сделать это.

  1. SMS-перехватывать входящие SMS и инициировать тянуть с сервера
  2. периодически опрашивайте сервер

каждый имеет свои ограничения. SMS-нет гарантии на время прибытия. Опрос может привести к разрядке аккумулятора.

У вас есть лучшее предложение, пожалуйста? Большое спасибо.

19 258

19 ответов:

официальный ответ Google-это Android Cloud to device Messaging Framework (рекомендуется) Google Cloud Messaging(рекомендуется)Облако Опорного Пункта Обмена Сообщениями

Он будет работать на Android >= 2.2 (на телефонах, которые имеют Play Store).

(кросс-постинг из ответа, который я дал на аналогичный вопрос -поддерживает ли Android в режиме реального времени push-уведомление?)

Я недавно начал играть с MQTT http://mqtt.org для Android как способ делать такие вещи (т. е. push-уведомление, которое не является SMS, но управляется данными, почти немедленная доставка сообщений, а не опрос и т. д.)

У меня есть сообщение в блоге с справочной информацией об этом в случае, если это полезно

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

(Примечание: MQTT-это технология IBM, и я должен отметить, что я работаю на IBM.)

Android Cloud to device Messaging Framework

важно: C2DM официально устарел по состоянию на 26 июня 2012 года. это означает, что C2DM перестал принимать новых пользователей и запросы квот. Никакие новые функции не будут добавлены в C2DM. Однако приложения, использующие C2DM, будут продолжать работать. Существующим разработчикам C2DM рекомендуется перейти на новую версию C2DM, которая называется Google Cloud Messaging for Android (GCM). См. документ миграции C2DM-to-GCM за дополнительной информацией. Разработчики должны использовать GCM для новой разработки.

пожалуйста, проверьте следующую ссылку:

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

здесь я написал несколько шагов для того, как получить RegID и уведомление, начиная с нуля

  1. создать / зарегистрировать приложение на Google Cloud
  2. настройка Cloud SDK с разработкой
  3. настройка проекта для GCM
  4. получить идентификатор регистрации устройства
  5. Отправлять Push-Уведомления
  6. Получать Push-Уведомления

вы можете найти полный учебник в ниже URL ссылка

начало работы с Android Push Notification: последнее облако Google Обмен сообщениями (GCM) - шаг за шагом полный учебник

enter image description here

code snip, чтобы получить регистрационный идентификатор (маркер устройства для Push-уведомления).

настройка проекта для GCM


Обновить файл AndroidManifest

для включения GCM в нашем проекте нам нужно добавьте несколько разрешений в наш файл манифеста Зайдите в AndroidManifest.XML и добавить ниже код Добавить Разрешение

<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" />

Добавить объявление приемника вещания GCM

добавить объявление приемника вещания GCM в теге приложения

<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/>

Добавить объявление GCM Servie

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

получить регистрационный идентификатор (маркер устройства для Push-уведомления)

Теперь перейдите к запуску / всплеск активности

добавить Константы и переменные класса

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;

обновить методы OnCreate и OnResume

@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);
}

Примечание: пожалуйста, храните REGISTRATION_KEY, это важно для отправки сообщения PN в GCM также держите в моем это будет уникальным для всех устройств, с помощью этого только GCM будет отправлять Push-уведомления.

Получать Push-Уведомления

добавить класс приемника вещания GCM

как мы уже заявили "GcmBroadcastReceiver.java " в нашем файле манифеста, так что давайте создадим этот класс обновите код класса приемника таким образом

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();
    }
}

добавить класс обслуживания GCM

как мы уже объявили "GcmBroadcastReceiver.java " в нашем файле манифеста, так что давайте создадим этот класс обновите код класса приемника таким образом

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());
     }
}

мое понимание / опыт работы с Android push notification являются:

  1. C2DMGCM - если ваша целевая платформа android 2.2+, а затем пойти на это. Только один улов, пользователи устройств должны быть всегда вошел в систему с учетной записью Google получить сообщения.

  2. MQTT - паб/суб подход, требуется активное соединение с устройством, может привести к разрядке аккумулятора, если не реализовано разумно.

  3. Дьяконов - может быть не очень хорошо в долгосрочной перспективе из-за ограниченной поддержки сообщества.

Edit: добавлено 25 ноября 2013 года

GCM - говорит Google...

для устройств до 3.0 это требует, чтобы пользователи настроили свою учетную запись Google на своих мобильных устройствах. Учетная запись Google не является обязательным требованием на устройствах под управлением Android 4.0.4 или выше.*

существует новая попытка с открытым исходным кодом для разработки библиотеки Java для push-уведомлений на Android на основе веб-сервера Meteor. Вы можете проверить это на блог проекта диакон, где вы найдете ссылки на Meteor и репозиторий GitHub проекта. Нам нужны разработчики, поэтому, пожалуйста, распространите слово!

вы можете использовать Xtify (http://developer.xtify.com) - у них есть веб-сервис push-уведомлений, который работает с их SDK. это бесплатно и до сих пор, это сработало очень хорошо для меня.

или....

3) держите соединение с сервером, отправляйте keep-alives каждые несколько минут,и сервер может мгновенно отправлять сообщения. Это как в Gmail, Гугл Talk и т. п. завод.

Я рекомендую использовать GCM-Google Cloud Messaging для Android Это бесплатно, и для простого использования это должно быть очень легко.

однако для отправки уведомлений от вашего имени требуется поддерживать сервер 3rd side. Если вы хотите избежать этого, есть некоторые очень хорошие промышленные решения для службы push-уведомлений Android:

  • Городского Дирижабль - бесплатно до 1м уведомлений в месяц, после чего вы платите за 1000 уведомления
  • PushApps - бесплатно для 1м уведомлений в месяц, и неограниченные уведомления для 19.99 в месяц
  • PushWoosh для 1М устройств премиум-планы от 39 евро

Diclaimer - я работаю в PushApps, а также использую их продукт в своих приложениях уже более года.

по состоянию на 18/05/2016 военнослужащих является единой платформой Google для мобильных разработчиков, включая уведомления толчка.

боюсь, вы нашли оба возможных способа. Google, по крайней мере изначально, собирался реализовать api GChat, который вы могли бы использовать для реализации push/pull. К сожалению, эта библиотека была сокращена Android 1.0.

Я не знаю, если это все-таки полезно. Я достиг чего-то подобного с библиотекой java в http://www.pushlets.com/

Althoug делать это в службе не помешает android от закрытия его вниз убийство потока слушателя.

Google C2DM амортизируется сейчас, для этого у вас есть o использовать новый сервис GCM (Google Cloud Messaging). Для документирования см. http://developer.android.com/guide/google/gcm/gs.html

C2DM: ваше приложение-пользователи должны иметь учетную запись gmail.

MQTT: когда ваше соединение достигло 1024, оно перестанет работать из-за того, что оно использовало "select model" linux.

есть бесплатный push-сервис и api для android, вы можете попробовать его:http://push-notification.org

свободный и простой метод:

Если ваша целевая база пользователей не велика (менее 1000), и вы хотите начать бесплатный сервис, то Airbop является лучшим и наиболее удобным.

Сайт Airbop Он использует службу обмена сообщениями Google Cloud через свой API и обеспечивает хорошую производительность. я использовал его для моих проектов, и это было легко реализовывать.

услуги, такие как и урбанизация, превосходны, но обеспечивают весь стек развертывания, а не только push-уведомления.

Если только push-сервис является вашей целью, Airbop будет работать нормально.

Я не использовал Pushwoosh, но это также отличный выбор. Это позволяет нажать на 1,000,000 устройств бесплатно

Я бы предложил использовать как SMS, так и HTTP. Если пользователь не вошел в систему отправить свой телефон SMS, чтобы уведомить их есть сообщение ждет.

вот как работает этот сервис Ericsson Labs:https://labs.ericsson.com/apis/mobile-java-push/

Если вы реализуете это самостоятельно, сложная часть-удаление входящего SMS без его просмотра пользователем. Или, может быть, это нормально, если они видят это в вашем случае.

похоже, это работает: удаление SMS с помощью BroadCastReceiver-Android

да, написание такого кода может быть опасным, и вы можете потенциально разрушить чью-то жизнь, потому что ваше приложение удалило SMS, которого оно не должно было иметь.

вы можете использовать Google Cloud Messaging или GCM, это бесплатно и легко использовать. Также вы можете использовать сторонние push-серверы, такие как PushWoosh что дает вам больше гибкости

есть много сторонних серверах таких как Городского Дирижабль, Xtify, магистрали, ... которые позволяют отправлять сообщения не только на Android, но и на iOs, Windows Phone ...

можно использовать толкатель

это размещенный сервис, который позволяет легко добавлять данные и функции в режиме реального времени в веб-и мобильные приложения.
Pusher предлагает библиотеки для интеграции во все основные среды выполнения и фреймворки.

PHP, Ruby, Python, Java, .NET, Go and Node на сервере
JavaScript, Objective-C (iOS) and Java (Android) на клиенте.