Android GCM: не отправлять уведомления, когда устройство не работает.
Уведомления GCM не принимаются, когда мое устройство находится в режиме ожидания. Все они проходят сразу, когда устройство проснулось. Вот код, который отправляет сообщение в GCM:
Sender sender = new Sender(API_KEY);
Message message = new Message.Builder().addData("type","newRequest").delayWhileIdle(false).build();
MulticastResult results = sender.send(message, devices, 5);
Вот мой класс GCMIntentService:
Открытый класс GCMIntentService расширяет GCMBaseIntentService {
public static final String SENDER_ID = "XXXXXXXXXXXXX";
public GCMIntentService(){
super(SENDER_ID);
}
@Override
protected void onError(Context context, String errorId) {
// TODO Auto-generated method stub
}
@Override
protected void onMessage(Context context, Intent intent) {
// TODO Auto-generated method stub
WakeLocker.acquire(context);
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
long when = System.currentTimeMillis();
int icon = R.drawable.ic_dialog_info;
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(this,0, notificationIntent, 0);
Notification noti = new NotificationCompat.Builder(this)
.setWhen(when).setContentTitle("New Storage Request")
.setContentText("Touch to open app")
.setSmallIcon(icon)
.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
.setTicker("New Storage Request").setAutoCancel(true)
.setContentIntent(contentIntent)
.getNotification();
mNotificationManager.notify(0, noti);
}
@Override
protected void onRegistered(Context context, String regId) {
// TODO Auto-generated method stub
RestClient client = new RestClient(StorageApp.STORAGE_HOST+"StorageWebService/rest/operations/registerForGCM");
client.AddParam("regId", regId);
try {
client.Execute(RequestMethod.GET);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("done with call");
}
@Override
protected void onUnregistered(Context context, String regId) {
// TODO Auto-generated method stub
RestClient client = new RestClient(StorageApp.STORAGE_HOST+"StorageWebService/rest/operations/unregisterForGCM");
client.AddParam("regId", regId);
try {
client.Execute(RequestMethod.GET);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
WakeLocker - это код, описанный в этом ответе:
Андроид AlarmManager не пробуждает телефон
Ответы
Ответ 1
GCM может отправлять сообщения только на устройства, находящиеся в спящем режиме, если устройство имеет мобильное подключение к данным, например, телефон. Для устройств с WiFi-устройством, если устройство засыпает, сообщения GCM не будут доставлены до тех пор, пока что-то не пробудет устройство, достаточно долго, чтобы устройство решило подключиться к WiFi.
Ответ 2
В коде на стороне сервера проверьте значение, которое вы передаете в методе delayWhileIdle(). сделайте это ложным. Он будет работать.
Ответ 3
Для Marshmallow, пожалуйста, посмотрите на это:
https://developer.android.com/training/monitoring-device-state/doze-standby.html#using_gcm
GCM оптимизирован для работы с режимами ожидания Doze и App Standby с помощью высокоприоритетных сообщений GCM.