1

我試圖在上傳帖子時將通知推送到應用程序的最終用戶。它在應用程序處於前景和背景時正常工作,但在應用程序被終止或關閉時不顯示(不在背景和前景中)。有什麼方法可以在應用程序關閉時顯示通知。 這裏是我部署到firebase函數的index.js代碼。通知不會出現在使用Firebase的應用程序的死亡狀態中

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> 

謝謝。

+0

請務必在您的清單中註冊您的接收器 – portfoliobuilder

+0

感謝您的支持。我在編輯中添加了清單。我是使用Firebase通知的新手。你能否提一下我應該做什麼修改以便在應用程序關閉時收到通知。 @portfoliobuilder – maneesh

+0

查看我的回答[here](https://stackoverflow.com/a/39505298/4625829)(也包含在@ BobSnyder的答案中)。 –

回答

1

您需要爲您的來電sendToTopic()指定的options objectpriority: "high"。這將喚醒設備,接收消息,如果它處於空閒/休眠模式:

const options = { 
    priority: "high" 
}; 

admin.messaging().sendToTopic(topic, payload, options).then(...); 

如果具有高優先級發送消息沒有幫助,那麼你可能會在手機上的車型之一測試當它以某種方式被殺死時(例如從最近的任務列表中滑動),該應用程序將在Stopped State中放置一個應用程序。有關更多詳細信息,請參閱this answer

This answer包含華爲/ EMOI設備解決方案。您可以將您的應用列入白名單,以免其被強行停止:高級設置>電池>受保護的應用程序

+0

我根據您的建議更新了代碼。但仍然應用程序在關閉時不顯示任何通知。我在3種不同的手機上嘗試過,但結果仍然一樣。您能否提出建議,讓應用程序即使在關閉時也能顯示通知。 – maneesh

0

其實你以錯誤的方式訪問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()); 
} 

有關更多詳細信息請參見官方例如通過谷歌

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

相關問題