Android — отправка push-уведомлений через GCM с приложением на переднем плане / в фоновом режиме

Я добавляю Push-уведомления через GCM в свое приложение, но что-то застряло.

Когда я отправляю push-уведомление с моим приложением на переднем плане (открытым и на экране), оно отображается нормально, как и предполагалось:

Push-уведомление с приложением на переднем плане

Но когда я отправляю его со своим приложением в фоновом режиме, оно отображается так:

Push-уведомление с приложением в фоновом режиме

Поэтому мое большое изображение и цвет фона значка не отображаются.

Код для HTTP-вызова GCM:

{
  "notification": {
    "title": "Tecolutla, Veracruz",
    "body": "¡Bienvenidos a Tecolutla!",
    "icon": "push"
  },
  "priority": "high",
  "data": {
    "Mensaje": "Descubre muchísimos lugares en Visita Xalapa.",
    "Class" : "Festividades"
  },
  "to": "/topics/global"
}

Код для GsmListenerService:

@SuppressWarnings("ConstantConditions")
    private void sendNotification(Bundle data) {
        Intent intent = new Intent(this, TecolutlaVeracruz.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.putExtra("Push_Title", data.getBundle("notification").getString("title"));
        intent.putExtra("Push_Body", data.getBundle("notification").getString("body"));
        intent.putExtra("Push_Mensaje", data.getString("Mensaje"));
        int Color = ColorManager.getColorBase(Main.INICIO);
        if(data.containsKey("Class")){
            if(data.getString("Class").equals("Inicio")) Color = ColorManager.getColorBase(Main.INICIO);
            else if(data.getString("Class").equals("Nuestro Municipio")) Color = ColorManager.getColorBase(Main.NUESTRO_MUNICIPIO);
            else if(data.getString("Class").equals("Festividades")) Color = ColorManager.getColorBase(Main.FESTIVIDADES);
        }
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.push)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.acercade_applogo))
                .setContentTitle(data.getBundle("notification").getString("title"))
                .setContentText(data.getBundle("notification").getString("body"))
                .setAutoCancel(true)
                .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
                .setColor(Color)
                .setVibrate(new long[]{ 0, 100, 200, 300 })
                .setContentIntent(pendingIntent);
        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }

Еще одна проблема, с которой я столкнулся, заключается в том, что уведомление не будет отображаться, если приложение будет убито или не запущено. Это нормально?


person Samuel Gaona    schedule 22.02.2016    source источник


Ответы (1)


Поэтому мое большое изображение и цвет фона значка не отображаются.

Это связано с тем, что Android теперь использует дизайн материалов, а значок по умолчанию для push-уведомлений будет полностью белым. Также у большой иконки всегда должен быть фон (т.е. аватар). Оно отображается на разных цветах фона, поэтому оно должно быть непрозрачным.

Пожалуйста, обратитесь к этим вопросам SO: Большой значок уведомлений Android не работает и Большой значок уведомлений Android не работает

Еще одна проблема, с которой я столкнулся, заключается в том, что уведомление не отображается, если приложение убито или не запущено. Это нормально?

Уведомление Android реализовано как служба, которая запускается BroadcastReceiver. Причина, по которой вы больше не получаете уведомление о принудительном закрытии приложения, заключается в том, что эта Служба также была принудительно закрыта. BroadcastReceiver, который запускает службу, прослушивает событие ACTION_BOOT_COMPLETED и событие ACTION_USER_PRESENT. Это означает, что сервер запускается при загрузке и перезапускается всякий раз, когда пользователь разблокирует экран блокировки.

Как указано здесь:

Ваше приложение может принимать трансляции GCM только до тех пор, пока вы не отключите его явно. Как только вы его убьете, он не будет получать никаких трансляций до следующего запуска. Однако если вы переместите свое приложение в фоновый режим (например, запустив другое приложение или нажав кнопку «Назад», пока не перейдете на главный экран или в другое приложение), ваше приложение все равно будет получать сообщения от GCM.

Поэтому, если вы принудительно закроете свое приложение, перейдя в настройки, push-уведомления перестанут работать. Когда вы снова откроете приложение, вы получите уведомление.

person abielita    schedule 23.02.2016
comment
Таким образом, цвет и большой значок не будут отображаться, если приложение находится в фоновом режиме? Любое решение для этого? - person Samuel Gaona; 23.02.2016