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

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

  • SMS - перехватить входящие SMS и инициировать выключение с сервера.
  • Опрос сервера периодически

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

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

Ответ 2

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

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

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

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

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

Ответ 3

Мое понимание/опыт с уведомлением Android push:

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

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

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

Изменить: добавлено 25 ноября 2013 г.

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

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

Ответ 4

Android Cloud to Device Messaging Framework

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

Просьба проверить следующую ссылку:

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

Ответ 5

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

  • Создать/зарегистрировать приложение в Google Cloud
  • Настройка облачного SDK с развитием
  • Настройка проекта для GCM
  • Получить идентификатор регистрации устройства
  • Отправить Push-уведомления
  • Получение уведомлений о доставке

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

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

enter image description here

Снимок кода, чтобы получить регистрационный идентификатор (токен устройства для 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 Broadcast Receiver в свой тег приложения

<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 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 Message в GCM также сохранится в моей, это будет уникальным для всего устройства, используя этот только GCM, отправит Push Notification.

Получение уведомлений о доставке

Добавить класс ретранслятора 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 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());
     }
}

Ответ 6

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

Ответ 7

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

Ответ 8

или....

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

Ответ 9

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

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

  • Urban Airship - бесплатно до 1M уведомлений в месяц, после чего вы будете платить за 1000 уведомлений.
  • PushApps - бесплатно для уведомлений 1M в месяц и неограниченных уведомлений за 19.99 в месяц
  • PushWoosh - бесплатно для 1M устройств, премиальные планы от 39 EURO

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

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

Ответ 13

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

MQTT: когда ваше соединение достигло 1024, оно перестанет работать, потому что в нем используется "выбрать модель" для Linux.

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

Ответ 15

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

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

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

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

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

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

Ответ 16

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

Как работает эта служба Ericsson Labs: https://labs.ericsson.com/apis/mobile-java-push/

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

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

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

Ответ 17

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

Ответ 18

Там много сторонних серверов, таких как Urban Airship, Xtify, Mainline,... позволяют отправлять не только на Android, но и на iOs, Windows Phone...