Статьи

Google Cloud Messaging с Android

Возможно, вы слышали о C2DM (обмен сообщениями между облаками) , который в основном позволял сторонним приложениям отправлять (отправлять) легкие сообщения в свои приложения Android. Что ж, C2DM как таковой сейчас устарел и заменен своим преемником по эволюционной лестнице: GCM или Google Cloud Messaging .

GCM — это (бесплатный) сервис, который позволяет разработчикам отправлять 2 типа сообщений со своих серверов приложений на любое количество устройств Android, зарегистрированных в сервисе:

  1. Разборные сообщения  «отправить в синхронизацию»
  2. Не складывающиеся сообщения с полезной нагрузкой до 4 КБ

«Разборный» означает, что самое последнее сообщение перезаписывает предыдущее. Сообщение «отправить на синхронизацию» используется для уведомления мобильного приложения о синхронизации его данных с сервером. Если устройство подключается к сети после того, как какое-то время находится в автономном режиме, клиент получит только самое последнее сообщение от сервера.

Если вы хотите добавить push-уведомления в свои приложения Android, руководство « Приступая к работе» шаг за шагом проведет вас через процесс настройки, даже предоставив вам демонстрационное приложение из двух частей (клиент + сервер), которое вы можете просто установить и воспроизвести. вокруг с. Процесс настройки предоставит вам две наиболее важные части информации, необходимые для запуска GCM:

  1. Ключ API , нужен ваш сервер для отправки GCM уведомления толчка
  2. Sender ID , нужно вашим клиентам получать сообщения GCM с сервера

Все суммировано на следующем экране, который вы получите после использования консоли API Google:

Чтобы написать код как для сервера, так и для клиента, самый быстрый способ — установить демонстрационное демонстрационное приложение и настроить его под свои нужды. В частности, вы можете сделать хотя бы одно из следующих действий:

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

Мы сделаем последний вариант в качестве примера. Выбрав место окончания демонстрации, вы можете быстро настроить Push-настройки и интегрировать их в существующие клиенты приложений Android.

В каталоге ресурсов проекта Android (  res / xml)  создайте файл preference.xml, например, такой:

 
 <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
 <PreferenceCategory
 android:title="Push Information" >
 <EditTextPreference
 android:key="sname"
 android:summary="Enter the Server Name"
 android:title="Name" />
 <EditTextPreference
 android:key="sip"
 android:summary="Enter the Server IP Address"
 android:title="IP Address" />
 <EditTextPreference
 android:key="sport"
 android:summary="Enter the Server Port"
 android:title="Port" />
 <EditTextPreference
 android:key="sid"
 android:summary="Enter the Sender ID"
 android:title="Sender ID" />
 </PreferenceCategory>

<PreferenceCategory
 android:title="Push Settings" >
 <CheckBoxPreference
 android:key="enable"
 android:summary="On/Off"
 android:title="Enable Server Push" />
 </PreferenceCategory>
</PreferenceScreen>
 

И соответствующая активность:

// package here
import android.os.Bundle;
import android.preference.PreferenceActivity;

public class PushPrefsActivity extends PreferenceActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {

	   super.onCreate(savedInstanceState);
	   addPreferencesFromResource(R.xml.preferences);
	}

}

Выше будет предоставлен следующий интерфейс:

 

Флажок «Включить отправку сервера» — это место, где пользователь приложения Android решает зарегистрироваться для отправки push-сообщений. Тогда это только вопрос использования этого класса предпочтений в вашей основной деятельности и выполнения необходимой обработки ввода. Следующий класс скелета показывает только ваши собственные надстройки кода для уже существующего примера приложения:

// package here
import com.google.android.gcm.GCMRegistrar;
// other imports here

public class MainActivity extends Activity {

      /** These two should be static imports from a Utilities class*/
      public static String SERVER_URL;
      public static String SENDER_ID;

      private boolean PUSH_ENABLED;

      /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        // other code here...
        processPush();
   }

    /** Check push on Back button 
      * if PushPrefsActivity is next activity on stack
      */
    @Override
    public void onResume(){

    	super.onResume();
    	processPush();
    }

    /**
     * Enable user to register/unregister for push notifications
     *  1. Register user if all fields in prefs are filled AND flag is set
     *  2. Un-register if flag is un-set and user is registered
     * */
    private void processPush(){

        if( checkPushPrefs() && PUSH_ENABLED ){
    	   // register for GCM using the Sample app code
        }
        if(! PUSH_ENABLED && GCMRegistrar.isRegisteredOnServer(this) ){
        	 GCMRegistrar.unregister(this);
        }
    }

    /** Check Server Push preferences */
    private boolean checkPushPrefs(){

    	SharedPreferences prefs = PreferenceManager
                                 .getDefaultSharedPreferences(this);
    	String name     =  prefs.getString("sname", "");
    	String ip       =  prefs.getString("sip", "");
    	String port     =  prefs.getString("sport", "");
    	String senderID =  prefs.getString("sid", "");
    	PUSH_ENABLED    =  prefs.getBoolean("enable", false);

    	boolean allFilled = checkAllFilled(name, ip, port, senderID);
    	if( allFilled ){
    		SENDER_ID = senderID;
    		SERVER_URL = "http://" + ip + ":" + port + "/" + name;
    	}
    	return allFilled;
    }

    /** Checks if any number of string fields are filled */
    private boolean checkAllFilled(String... fields){
    	for (String field:fields){
    		if(field == null || field.length() == 0){
    			return false;
    		}
    	}
    	return true;
    }

}

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

GCM довольно прост в настройке, так как большая часть сантехнических работ выполняется за вас. Примечание: если вы хотите выделить функциональность push в своем собственном подпакете, имейте в виду, что служба GCM GCMIntentService, предоставляемая приложением Sample и отвечающая за обработку сообщений GCM, должна находиться в вашем основном пакете (как указано в документация по настройке) — иначе GCM не будет работать.

При обмене данными с сервером примеров через HTTP Post, клиент примеров выполняет ряд автоматических повторных попыток с использованием экспоненциального отката , что означает, что период ожидания перед повторной попыткой в ​​случае сбоя каждый раз вдвое превышает значение предыдущего периода ожидания. максимальное количество попыток (5 на момент написания статьи). Вы можете изменить это, если оно вам не подходит. Однако это может не иметь большого значения, поскольку эти повторные попытки выполняются в отдельном потоке (с использованием AsyncTask ) из основного потока пользовательского интерфейса, что сводит к минимуму влияние на существующий поток операций вашего мобильного приложения.

От: Блог Тони .