通知不会出现在使用Firebase的应用程序的死亡状态中

我试图在上传post时将通知推送给应用的最终用户。 它在应用程序处于前景和背景时正常工作,但在应用程序被终止或closures时不显示(不在背景和前景中)。 有没有什么办法显示应用程序closures时的通知。 这里是我部署到firebase函数的index.js代码。

const functions = require('firebase-functions'); let admin = require('firebase-admin'); admin.initializeApp(functions.config().firebase); exports.sendPush = functions.database.ref('/promos').onWrite(event => { var topic = "deals_notification"; let projectStateChanged = false; let projectCreated = false; let projectData = event.data.val(); if (((event.data.numChildren())-(event.data.previous.numChildren()))>0) { let msg="notification arrived" let payload = { data: { "msg":msg } }; admin.messaging().sendToTopic(topic, payload).then(function(response) { console.log("Successfully sent message:", response); }).catch(function(error) { console.log("Error sending message:", error); }); } }); 

这里是MyFirebaseMessageService:

 import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.util.Log; import com.google.firebase.messaging.FirebaseMessagingService; import com.google.firebase.messaging.RemoteMessage; public class MyFirebaseMessageService extends FirebaseMessagingService { @Override public void onMessageReceived(RemoteMessage remoteMessage) { super.onMessageReceived(remoteMessage); sendnotification(remoteMessage.getData().get("msg")); } private void sendnotification(String body){ Intent intent = new Intent(this, MainActivity.class); PendingIntent pIntent = PendingIntent.getActivity(this,0, intent, 0); Notification.Builder n = new Notification.Builder(this) .setContentTitle("Best Deals") .setContentText(body) .setSmallIcon(R.mipmap.ic_launcher) .setContentIntent(pIntent) .setAutoCancel(true); NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); manager.notify(0, n.build()); } } 

编辑:这是清单文件。

 <?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.priya.bestdeals"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="25" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <application android:name=".Application" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="@string/app_name" android:screenOrientation="portrait" android:theme="@style/AppTheme.NoActionBar"></activity> <activity android:name=".LoginActivity" /> <activity android:name=".RegisterActivity" /> <activity android:name=".Details"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="MainActivity" /> </activity> <activity android:name=".Posts" /> <activity android:name=".Settings" /> <activity android:name=".Postdetails" /> <activity android:name=".IntroActivity" /> <activity android:name=".SplashScreen" android:label="@string/app_name" android:screenOrientation="portrait" android:theme="@android:style/Theme.Black.NoTitleBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".WriteActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="MainActivity" /> </activity> <activity android:name=".DeleteActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="MainActivity" /> </activity> <activity android:name=".EditProfile"></activity> <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_notifications_black_24dp" /> <meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/colorAccent" /> <service android:name=".MyFirebaseInstanceIdService"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> </intent-filter> </service> <service android:name=".MyFirebaseMessageService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service> </application> 

谢谢。

您需要在sendToTopic()调用的选项对象中指定priority: "high" 。 如果处于闲置/打盹模式,则会唤醒设备以接收消息:

 const options = { priority: "high" }; admin.messaging().sendToTopic(topic, payload, options).then(...); 

如果以高优先级发送消息没有帮助,那么您可能正在testing其中一种将应用程序以某种方式中止(例如从最近的任务列表中滑动)时将应用程序置于“ 停止状态”的手机型号。 看到这个答案的更多细节。

这个答案包含华为/ EMOI设备的解决scheme。 您可以将您的应用列入白名单,以免其强制停止: 高级设置>电池>受保护的应用

其实你以错误的方式访问RemoteMessage。

  @Override public void onMessageReceived(RemoteMessage remoteMessage) { Log.e(TAG, "From: " + remoteMessage.getFrom()); if (remoteMessage == null) return; // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.e(TAG, "Notification Body: " + remoteMessage.getNotification().getBody()); handleNotification(remoteMessage.getNotification().getBody()); } } private void handleDataMessage(JSONObject json) { Log.e(TAG, "push json: " + json.toString()); try { JSONObject data = json.getJSONObject("data"); String title = data.getString("title"); String message = data.getString("message"); boolean isBackground = data.getBoolean("is_background"); String imageUrl = data.getString("image"); String timestamp = data.getString("timestamp"); JSONObject payload = data.getJSONObject("payload"); Log.e(TAG, "title: " + title); Log.e(TAG, "message: " + message); Log.e(TAG, "isBackground: " + isBackground); Log.e(TAG, "payload: " + payload.toString()); Log.e(TAG, "imageUrl: " + imageUrl); Log.e(TAG, "timestamp: " + timestamp); sendNotification(title,message); } catch (JSONException e) { Log.e(TAG, "Json Exception: " + e.getMessage()); } catch (Exception e) { Log.e(TAG, "Exception: " + e.getMessage()); } } private void sendNotification(String title,String message) { 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); Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_stat_ic_notification) .setContentTitle(title) .setContentText(messageBody) .setAutoCancel(true) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); } 

有关更多详细信息,请参阅google官方示例

https://github.com/firebase/quickstart-android/blob/master/messaging/app/src/main/java/com/google/firebase/quickstart/fcm/MyFirebaseMessagingService.java#L45-L82