我的Android手机并不总是收到通知,即使云功能始终发送它们。作为一个有用的侧节点:总是收到WhatsApp消息(我测试过它)。
我注意到在手机充电或打开应用程序时会立即收到通知。
此外,即使已显示通知,用户的UID也不会始终发送到数据库(您通过阅读代码了解我的意思)。
我的问题是:我可以更改哪些内容以接收通知,然后一直推送到数据库 ,就像它应该的那样?
我的通知是"单挑"类型。
我一直在努力优化天的代码,但没有成功。我需要帮助。
代码结构:
向用户发送通知。
public class MyFirebaseMessagingService extends FirebaseMessagingService {
// Firebase instance variables
private FirebaseAuth mFirebaseAuth;
private FirebaseUser mFirebaseUser;
DatabaseReference myURL = FirebaseDatabase.getInstance().getReferenceFromUrl("https://newproj-54a87.firebaseio.com/notified");
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
// Check if message contains a data payload.
if (remoteMessage.getData() != null) {
mFirebaseAuth = FirebaseAuth.getInstance();
mFirebaseUser = mFirebaseAuth.getCurrentUser();
if(mFirebaseUser != null)
mUID = mFirebaseUser.getUid();
myURL.push().setValue(mUID);
sendNotification(remoteMessage.getData().get("body"), remoteMessage.getData().get("title"), remoteMessage.getData().get("icon"));
}
}
private void sendNotification(String messageBody, String messageTitle, String iconURL) {
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
Bitmap bitmap = getBitmapFromURL(iconURL);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setDefaults(DEFAULT_SOUND | DEFAULT_VIBRATE)
.setPriority(Notification.PRIORITY_MAX)
.setStyle(new NotificationCompat.BigTextStyle())
.setSmallIcon(R.drawable.myIcon)
.setLargeIcon(bitmap)
.setContentTitle(messageTitle)
.setContentText(messageBody)
.setAutoCancel(true)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
public Bitmap getBitmapFromURL(String strURL) { //from https://stackoverflow.com/a/16007659
try {
URL url = new URL(strURL);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(input);
return myBitmap;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
我的云功能:
const payLoad = {
data:{
title: name,
body: body,
icon: photoURL
}
};
var options = {
priority: "high",
timeToLive: 1000
};
return admin.messaging().sendToTopic("notify", payLoad, options);
如果我忘记了一条信息,请告诉我。我在有限的时间表上跑步!
答案 0 :(得分:3)
如果您使用的是Android 6.0或以上版本,则可以使用名为Doze的功能来优化电池使用情况。当您的手机闲置(并且没有充电)它只会收到高优先级的FCM通知,可能就是您的情况。
FCM经过优化,可以通过手段与Doze和App Standby空闲模式配合使用 高优先级FCM消息。 FCM高优先级消息让你 可靠地唤醒您的应用程序以访问网络,即使用户的 设备处于Doze状态或应用程序处于App Standby模式。在Doze或App 待机模式,系统传递消息并提供应用程序 然后,临时访问网络服务和部分唤醒锁 将设备或应用程序返回到空闲状态。
因此,如果使用FCM数据消息,您的后端应该开始发送字段"priority" : "high"
参考:https://firebase.google.com/docs/cloud-messaging/concept-options