FCM推送通知在以下设备中正常运行:该设备处于后台,前景以及通过从托盘中刷卡关闭应用程序时。 品牌名称(Android版本) 麦克斯(5.1) 摩托罗拉(7.1.1) 诺基亚(8.1.0) 三星(8.0.0) 连结(8.1.0) 小米(7.1.2)
但是对于oneplus,当通过从托盘中滑动应用程序关闭时,fcm通知不起作用,但是当应用程序处于前台和后台时,fcm通知却可以正常工作。 设备版本 一加8.1.0
但是,当我手动关闭应用程序的电池优化选项时,在所有情况下,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);
}
});
}
任何小小的帮助将不胜感激
答案 0 :(得分:1)
发生这种情况是因为 Doze Mode ,您可以通过将后端的推送通知消息优先级设置为高消息优先级来解决此问题,请参阅 {{ 3}}
答案 1 :(得分:0)
在这些设备(如OnePlus,Huawie,OPPO)中,他们基于android os使用自定义版本的os操作系统,可能是在电池优化时,它强制关闭了FCM的后台服务,而我们没有通知。
答案 2 :(得分:0)
尝试此代码
Uri defaultSoundUri =
RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new
NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_notif_icon)
.setContentTitle("testTitle")
.setContentText(messageBody)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setChannelId("testChannelId") // set channel id
.setContentIntent(pendingIntent);