Натисніть сповіщення на платформі Android


266

Я хочу написати додаток, яке отримує надіслані сповіщення від сервера. Я знайшов пару методів для цього.

  1. SMS - перехоплюйте вхідні SMS та ініціюйте витяг з сервера
  2. Періодично опитуйте сервер

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

Чи є у вас краща пропозиція, будь ласка? Дуже дякую.


4
Ви також можете переглянути презентацію Google I / O 2010 про Push Notification developer.android.com/videos/index.html#v=PLM4LajwDVc
vokilam

Я думаю , ви можете подивитися на цей пост: stackoverflow.com/questions/17629942 / ... З Worklight ви можете отримати поштовх по різних каналах , включаючи ГКР.
Нерадж Кришна

1
Презентація Google I / O 2010 доступна на сайті youtube.com/watch?v=PLM4LajwDVc
elcuco

"Опитування може розрядити акумулятор." Ви можете запланувати опитування за допомогою AlarmManager, щоб акумулятор не був сильно розрядженим. Це просте і безкоштовне (не потрібно платити, як, наприклад, за GCM) рішення.
Deepscorn

Відповіді:


203

Офіційна відповідь Google - це система обміну повідомленнями пристроїв Android Cloud (застаріла) Cloud Cloud Messaging (застаріла) Firebase Cloud Messaging

Він буде працювати на Android> = 2.2 (на телефонах, які мають Play Store).


зараз у бета-версії, але ви можете зареєструватися, сподіваючись активуватися.
брак

3
Як правило, ви можете активуватися дуже швидко, і він використовується для таких речей, як GMail, так що це відомо, щоб працювати у виробництві. На жаль, їх зразкового коду для спілкування з серверним аспектом C2DM не вистачає. Я написав підручник з цього аспекту тут blog.boxedice.com/2010/10/07/…
DavidM

6
Проблема полягає в тому, що вам потрібен обліковий запис Google для користувачів: це, на мою думку, обмеження.
kaffein

33
Зауважте, що система обміну повідомленнями Android Cloud to Device застаріла. Нова структура називається Google Cloud Messaging, і її можна знайти тут: developer.android.com/guide/google/gcm/index.html
Ryan Berger

10 квітня 2018 року Google припинив GCM. API сервера та клієнта GCM було видалено 29 травня 2019 року. Перемістіть програми GCM на Firebase Cloud Messaging (FCM), яка успадковує надійну та масштабовану інфраструктуру GCM, а також багато нових функцій. Щоб дізнатися більше, перегляньте посібник з міграції.
paiego

29

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

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

У мене є повідомлення в блозі з довідковою інформацією про це, якщо це корисно

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

(Примітка. MQTT - це технологія IBM, і я повинен зазначити, що я працюю для IBM.)


Привіт, Дейл, я читав вашу публікацію в блозі про MQTT, і, безумовно, здається, що відповідає законопроекту за майже миттєве повідомлення про мобільні телефони. Але я не змогла знайти жодної інформації про те, як це насправді це робить. Чи постійно він тримає розетку відкритою? Як він повідомляє сервер, якщо його ip-адреса змінилася? Буду вдячний, якби ви могли пролити трохи світла на це. Ура: Нарен
Нарен

2
Це з'єднання тримає відкритим. У подальшій публікації ( dalelane.co.uk/blog/?p=1009 ) я розповів більше про наслідки тримання зв’язку відкритим - ви це бачили? Якщо з'єднання розірвано, про це можуть бути повідомлені і сервер, і клієнт. Тоді це рішення рівня додатка, щоб вирішити, як реагувати (наприклад, знову підключитися). Більше інформації можна знайти в документах, про які йдеться у публікації (наприклад, IA92: www-01.ibm.com/support/docview.wss?rs=171&uid=swg24006006 pdf на цій сторінці, а Javadoc у поштовій скриньці на цій сторінці)
dalelane

18

Моє розуміння / досвід роботи з натисканням на Android:

  1. C2DM GCM - Якщо ваша цільова платформа Android становить 2.2+, тоді перейдіть до цього. Лише один улов, користувачі пристроїв повинні завжди входити в обліковий запис Google, щоб отримувати повідомлення.

  2. MQTT - підхід на базі Pub / Sub, потребує активного підключення від пристрою, може зарядити акумулятор, якщо не реалізовано розумно.

  3. Диякон - може бути недобрим у довгостроковій перспективі через обмежену підтримку громади.

Редагувати : Додано 25 листопада 2013 року

GCM - Google каже ...

Для пристроїв, що перебувають до 3.0, це вимагає від користувачів налаштування акаунта Google на своїх мобільних пристроях. Обліковий запис Google не є вимогою для пристроїв із ОС Android 4.0.4 або новішої версії. *


Хоча для версії 4.0.4 або новішої версії облікового запису Google не потрібно, вам потрібно встановити додаток Google Play. Цікаво, як ви це встановите, не маючи облікового запису Google.
січня

1
@Jan: Додаток Google Play поставляється разом із пристроєм. Користувачеві не потрібно встановлювати.
Декстер

@Dexter, не всі пристрої Android за замовчуванням встановлено Google Play. Більшість з них встановлюють за замовчуванням, особливо пристрої, які купуються у авторитетних постачальників телефонів, але на пристроях, на яких просто ОС Android перетягнуті на них, не завжди може бути Google Play. (Наприклад, для багатьох емуляторів Android, таких як нові пристрої Genymotion, за замовчуванням немає Google Play.)
Спенсер D

Отже ... Чи найкращий варіант MQTT для пристроїв Android, на яких не встановлено Google Play?
Yeung

17

Android Cloud на пристрій обміну повідомленнями пристроїв

Важливо: 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


17

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

  1. Створіть / зареєструйте додаток у Google Cloud
  2. Налаштування хмарного SDK з розвитком
  3. Налаштування проекту для GCM
  4. Отримати ідентифікатор реєстрації пристрою
  5. Надіслати повідомлення Push
  6. Отримуйте Push-сповіщення

Ви можете знайти повний підручник нижче за посиланням URL

Початок роботи з Android Push-сповіщення: останнє хмарне обмін повідомленнями Google (GCM) - покроковий повний підручник

введіть тут опис зображення

Зніміть код, щоб отримати реєстраційний ідентифікатор (токен пристрою для повідомлення 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 у свій тег програми

<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” у нашому файлі Manifest, тому давайте створимо код цього класу приймача оновлення класу таким чином

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” у нашому файлі Manifest, тому давайте створимо код цього класу приймача оновлення класу таким чином

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

@Rohit Ви перевірили посилання, що має повний підручник. також, будь ласка, дайте мені знати, чого не вистачає. Я оновлю відповідь.
swiftBoy

11

Існує нова робота з відкритим кодом з розробки бібліотеки Java для push-сповіщень на Android на базі веб-сервера Meteor. Ви можете перевірити це в блозі проекту Deacon , де ви знайдете посилання на Meteor та сховище GitHub проекту. Нам потрібні розробники, тому, будь ласка, поширюйте слово!


9

Ви можете використовувати Xtify ( http://developer.xtify.com ) - у них є веб- сервіс із push-повідомленнями, який працює з їх SDK. це безкоштовно і поки що, він працює дуже добре для мене.


3
Я отримав відповідь від їхнього VP, в якій сказано, що не планується ніколи платити за послугу push. Це досить дивовижний SDK.
Робот Crowe T.

8

або….

3) Підтримуйте з'єднання з сервером, надсилайте параметри зберігання кожні кілька хвилин, і сервер може миттєво натискати повідомлення. Так працюють Gmail, Google Talk тощо.


5
Я думаю, що це, на жаль, призведе до значного розряду акумулятора. Якщо ви беретеся за цим маршрутом, не забудьте обмежити кількість часу, яким ви це зробите.
хасеман

Ні, насправді це не стане, тому що незадіяні TCP / IP-з'єднання майже не вимагають живлення на модемі стільникового зв'язку.
Ісаак Уоллер

Насправді це піде багато часу, тому ви праві. Передача тривалості з довгими інтервалами також дуже допомагає.
Ісаак Валлер

Що таке "довгі інтервали" в цьому плані? Я знаю, що gmail push працює так, але я не знаю, які інтервали очікування вони використовують.
тобсен

Я знайшов це зображення про продуктивність батареї "Потягніть проти Push": labs.ericsson.com/files/battery.jpg Я взяв це з API Push Ericsson тут: labs.ericsson.com/apis/mobile-java-push/documentation
Menda

6

Я рекомендую використовувати GCM - Google Cloud Messaging для Android Це безкоштовно, а для простого використання це має бути дуже просто.

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

  • Міський дирижабль - безкоштовно до 1 млн повідомлень на місяць, після чого вам стягується плата за 1000 повідомлень
  • PushApps - безкоштовний за 1 млн сповіщень на місяць та необмежений сповіщення за 19,99 на місяць
  • PushWoosh - безкоштовно для пристроїв 1М, плани преміум - від 39 євро

Діклаймер - я працюю в PushApps, а також використовую їхній продукт у своїх програмах вже більше року.


6

Станом на 18.05.2016 Firebase - це єдина платформа Google для розробників мобільних пристроїв, включаючи push-сповіщення.


4

Боюся, ви знайшли обидва можливі методи. Google, принаймні спочатку, збирався реалізувати GChat api, який можна було використовувати для реалізації push / pull. На жаль, цю бібліотеку вирізав Android 1.0.


1
Вони пообіцяли повернути її, як тільки проблеми безпеки будуть розроблені ... якщо це колись станеться.
Джеремі Логан

3

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

Althoug, роблячи це в сервісі, не завадить андроїду вимкнути його, вбивши нитку слухача.



2

C2DM: ваші користувачі програми повинні мати обліковий запис gmail.

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

Є безкоштовна послуга push і api для android, ви можете спробувати: http://push-notification.org


2

Безкоштовний і простий метод:

Якщо ваша цільова база користувачів не велика (менше 1000), і ви хочете розпочати безкоштовну послугу, то Airbop - найкращий і найзручніший.

Веб-сайт Airbop Він використовує сервіс Google Cloud Messaging за допомогою свого API і забезпечує високу ефективність. я використав його для двох своїх проектів, і його було легко реалізувати.

Такі послуги, як Urbanship, є чудовими, але забезпечують цілий стек розгортання, а не лише функцію push-сповіщень.

Якщо ваша ціль - лише push-сервіс, Airbop буде добре працювати.

Я не використовував Pushwoosh , але це також чудовий вибір. Це дозволяє проштовхувати 1000 000 пристроїв безкоштовно


1

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

Ось так працює ця послуга Ericsson Labs: https://labs.ericsson.com/apis/mobile-java-push/

Якщо ви реалізуєте це самостійно, складною частиною є видалення вхідного SMS, без того, щоб користувач його бачив. А може це нормально, якщо вони бачать це у вашому випадку.

Виглядає так: Видалення SMS за допомогою BroadCastReceiver - Android

Так, написання такого коду може бути небезпечним, і ви потенційно можете зруйнувати життя когось, оскільки ваша програма видалила SMS, якого він не повинен мати.


1
lol: "Так, написання такого коду може бути небезпечним, і ви можете потенційно зруйнувати життя когось, оскільки ваша програма видалила SMS, якого він не повинен мати". підтримати це. Лол.
Кумар Раві

Посилання на мобільний Java Push мертве, а сам сервіс здається застарілим.
naXa

1

Ви можете використовувати Google Cloud Messaging або GCM , це безкоштовно та просте у використанні. Крім того, ви можете використовувати сторонні push-сервери, такі як PushWoosh, що дає вам більше гнучкості


1

Є багато сторонніх серверів, таких як Urban Airship, Xtify, Mainline , ... які дозволяють надсилати не тільки на Android, але і на iOs, Windows Phone ...


1

Firebase Cloud Messaging (FCM) - нова версія GCM. FCM - це кросплатформенне рішення обміну повідомленнями, яке дозволяє надійно та безкоштовно надсилати повідомлення. Успадковує центральну інфраструктуру GCM для надійної доставки повідомлень на Android, iOS, Web (javascript), Unity та C ++.

Станом на 10 квітня 2018 року Google не схвалює GCM. API сервера і клієнтські API застаріли і будуть видалені 11 квітня 2019 року. Google рекомендує перемістити додатки GCM до Firebase Cloud Messaging (FCM), що успадковує надійну та масштабовану інфраструктуру GCM.

Ресурс


0

Можна використовувати Pusher

Це розміщена послуга, яка дозволяє легко додавати дані в реальному часі та функціональні можливості до Інтернету та мобільних додатків дуже просто.
Pusher пропонує бібліотекам інтегруватися у всі основні режими виконання та структури.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.