FCM push-уведомление работает должным образом на следующих устройствах, когда устройство находится в фоновом режиме, на переднем плане, а также, когда приложение закрывается, проводя из лотка.
Фирменное наименование (Android-версия)
Микромакс (5.1)
Motorola (7.1.1)
Nokia (8.1.0)
Samsung (8.0.0)
Нексус (8.1.0)
сяоми (7.1.2)
Но в случае oneplus уведомление fcm не работает, когда приложение закрывается путем пролистывания из лотка, но работает правильно, когда приложение находится на переднем и заднем плане.
Версия устройства
OnePlus 8.1.0
Но когда я вручную отключаю опцию оптимизации батареи для своего приложения, то во всех случаях push-уведомление fcm работает должным образом на устройстве Oneplus
Мой androidManifest.xml - это
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.demo.Notification"
android:installLocation="auto">
<uses-permission android:name="android.permission.VIBRATE" />
<application
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<!-- [START fcm_default_icon] -->
<!-- Set custom default icon. This is used when no icon is set for incoming notification messages. -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@mipmap/ic_launcher" />
<!-- [END fcm_default_icon] -->
<!-- [START fcm_default_channel] -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/default_notification_channel_id"/>
<!-- [END fcm_default_channel] -->
<service
android:name=".MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<activity
android:name="com.demo.Notification.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
MyFirebaseMessagingService.java
package com.demo.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationManagerCompat;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
import org.json.JSONObject;
public class MyFirebaseMessagingService extends FirebaseMessagingService
{
private static final String NOTIFICATION_MESSAGE_KEY = "MESSAGE";
private NotificationManager notificationManager;
@Override
public void onMessageReceived(RemoteMessage remoteMessage)
{
sendNotification(remoteMessage.getData().get(NOTIFICATION_MESSAGE_KEY));
}
private void sendNotification(String msg)
{
String notification_message_title = "";
String notification_message_text = "";
int notification_id = 1;
String channel_id = getString(R.string.default_notification_channel_id);
try
{
JSONObject jsonObject = new JSONObject(msg);
if(jsonObject.has("notification_message_title"))
{
notification_message_title = jsonObject.getString("notification_message_title");
notification_message_title = (notification_message_title != null) ? notification_message_title.trim() : "";
}
if(jsonObject.has("notification_message_text"))
{
notification_message_text = jsonObject.getString("notification_message_text");
notification_message_text = (notification_message_text != null) ? notification_message_text.trim() : "";
}
if("".equals(notification_message_title))
{
return;
}
if("".equals(notification_message_text))
{
return;
}
}
catch(Exception e)
{
return;
}
notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
setupChannels();
}
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this,channel_id);
mBuilder.setAutoCancel(true);
mBuilder.setPriority(NotificationCompat.PRIORITY_MAX);
mBuilder.setContentTitle(notification_message_title);
mBuilder.setContentText(notification_message_text);
mBuilder.setColor(Color.BLUE);
mBuilder.setSmallIcon(R.mipmap.ic_launcher);
Bitmap largeIcon = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
mBuilder.setLargeIcon(largeIcon);
Uri notificationSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
mBuilder.setSound(notificationSound);
Intent resultIntent = new Intent(this, MainActivity.class);
resultIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent resultPendingIntent =
PendingIntent.getActivity(
this,
notification_id,
resultIntent,
PendingIntent.FLAG_UPDATE_CURRENT
);
mBuilder.setContentIntent(resultPendingIntent);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
mBuilder.setChannelId(channel_id);
}
NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(this);
notificationManagerCompat.notify(notification_id, mBuilder.build());
//SEND Notification END
}
@RequiresApi(api = Build.VERSION_CODES.O)
private void setupChannels(){
String channel_id = getString(R.string.default_notification_channel_id);
CharSequence channelName = getString(R.string.default_notification_channel_name);
NotificationChannel channel = new NotificationChannel(channel_id, channelName, NotificationManager.IMPORTANCE_MAX);
channel.enableLights(true);
channel.setLightColor(Color.BLUE);
channel.enableVibration(true);
if (notificationManager != null) {
notificationManager.createNotificationChannel(channel);
}
}
}
Мой уровень приложения build.gradel
apply plugin: 'com.android.application'
android {
compileSdkVersion 27
buildToolsVersion "27.0.3"
defaultConfig {
applicationId "com.demo.Notification"
minSdkVersion 19
targetSdkVersion 27
versionCode 1
versionName "1.0.0"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets { main { assets.srcDirs = ['src/main/assets', 'src/main/assets/'] } }
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:27.1.1'
compile 'com.google.code.gson:gson:2.2.4'
compile 'com.google.firebase:firebase-messaging:17.3.0'
}
apply plugin: 'com.google.gms.google-services'
Мой уровень проекта build.gradle
buildscript {
repositories {
jcenter()
maven {
url "https://maven.google.com"
}
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
classpath 'com.google.gms:google-services:4.1.0'
}
}
allprojects {
repositories {
jcenter()
maven {
url "https://maven.google.com"
}
}
}
И таким образом я отправляю токен на сервер
public void registerDevice()
{
FirebaseInstanceId.getInstance().getInstanceId()
.addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
@Override
public void onComplete(@NonNull Task<InstanceIdResult> task)
{
String registrationId = task.getResult().getToken();
sendTokenToServer(registrationId);
}
});
}
Любая маленькая помощь будет оценена