11

Я проверяю Firebase Cloud Messaging для отправки уведомлений. Внедрили его уже и его получение уведомления, когда приложение находится в открытом состоянии. Но если я закрываю приложение, его больше не выдают уведомление. Есть ли решение для этого.Приложение для Android не принимает уведомление FCM при закрытии

Код:

WebRequest wRequest; 
wRequest = WebRequest.Create("https://fcm.googleapis.com/fcm/send"); 
wRequest.Method = "post"; 
wRequest.ContentType = " application/json;charset=UTF-8"; 
wRequest.Headers.Add(string.Format("Authorization: key={0}", AppId)); 

wRequest.Headers.Add(string.Format("Sender: id={0}", SenderId)); 

string postData = "{\"registration_ids\":[\"" + regIds + "\"], \"data\": "+ value +"}"; 

Byte[] bytes = Encoding.UTF8.GetBytes(postData); 
wRequest.ContentLength = bytes.Length; 

Stream stream = wRequest.GetRequestStream(); 
stream.Write(bytes, 0, bytes.Length); 
stream.Close(); 

WebResponse wResponse = wRequest.GetResponse(); 

MESSAGING Услуги-

public class MessagingService extends FirebaseMessagingService { 
    @Override 
    public void onMessageReceived(RemoteMessage remoteMessage) { 
     Map<String, String> data = remoteMessage.getData(); 
     sendNotification(data); 
    } 

    public void showMessage(Map<String, String> serverData) { 
     Intent i = new Intent(this,MainActivity.class); 
     i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

     PendingIntent pendingIntent = PendingIntent.getActivity(this,0,i,PendingIntent.FLAG_UPDATE_CURRENT); 

     NotificationCompat.Builder builder = new NotificationCompat.Builder(this) 
       .setAutoCancel(true) 
       .setContentTitle(serverData.get("Title")) 
       .setContentText(serverData.get("Message")) 
       .setSmallIcon(R.drawable.common_google_signin_btn_icon_dark) 
       .setContentIntent(pendingIntent); 

     NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 

     manager.notify(Integer.parseInt(serverData.get("ItemId")),builder.build()); 
    } 

    private void sendNotification(Map<String, String> serverData) { 
     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_UPDATE_CURRENT); 

     long[] pattern = {500,500,500,500,500}; 

     Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 

     NotificationCompat.Builder notificationBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(this) 
       .setSmallIcon(R.drawable.common_google_signin_btn_icon_dark) 
       .setContentTitle(serverData.get("Title")) 
       .setContentText(serverData.get("Message")) 
       .setAutoCancel(true) 
       .setVibrate(pattern) 
       .setLights(Color.BLUE,1,1) 
       .setSound(defaultSoundUri) 
       .setContentIntent(pendingIntent); 

     NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     notificationManager.notify(Integer.parseInt(serverData.get("ItemId")), notificationBuilder.build()); 
    } 

} 

Главная деятельность-

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     FirebaseMessaging.getInstance().subscribeToTopic("test"); 
     FirebaseInstanceId.getInstance().getToken(); 
    } 
} 

Manifest-

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="test.com.firebasenotify"> 
    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <service android:name=".MessagingService"> 
      <intent-filter> 
       <action android:name="com.google.firebase.MESSAGING_EVENT" /> 
      </intent-filter> 
     </service> 
     <service android:name=".InstanceIDService"> 
      <intent-filter> 
       <action android:name="com.google.firebase.INSTANCE_ID_EVENT" /> 
      </intent-filter> 
     </service> 

    </application> 

</manifest> 
+1

Показать ТСМ класс слушателя, и показать POST прошу вас сделать для FCM –

+0

Изменено службы обмена сообщениями, ТСМ пост и основной код деятельности –

+0

ли вы получите сообщение в OnReceive по крайней мере? –

ответ

8

Не было проблем с кодом. Я использовал Mi note 4, и как-то он не показывает уведомление в Mi4, когда приложение закрыто. Я тестировал с другим устройством Android и работал нормально.

Спасибо Тиму Кастелинсу и Франку ван Пуффелену за участие в разговоре.

+2

Для MI вам нужно поместить приложение в режим автозапуска в Security, чтобы получить уведомление, когда приложение закрыто. –

+0

Спасибо, человек, в redmi prime2, также получая такую ​​же проблему. Вы нашли решение для этой проблемы в устройствах MI? – sandeepmaaram

-1

добавление time_to_live ключа в Payload POST будет решить эту problem.The значение этого параметра должна быть длительностью от 0 до 2419200 секунд, и это соответствует максимальному периоду времени, в течение которого FCM хранит и пытается доставить сообщение. "time_to_live": 3Refer Firebase Docs

+1

Это, вероятно, действует только в том случае, если пользователь возвращается к приложению. – ioanb7

-3

Как за FCM документы onMessageReceived() не будет вызываться, когда приложение находится в фоне. Вы должны послать уведомления объекта на заказ, чтобы показать его в системном трее и когда пользователь щелкает его пусковой активность будет открыта с данными, как статистов с намерением. Для полезной нагрузки вы должны использовать данные объект. see docs и Receive Messages in an Android App

+2

, если вы видите код, там нет объекта уведомления. Он отправляет только объект данных –

+0

, вам также необходимо отправить объект уведомления. – Sjd

+2

, но если мы отправим объект уведомления, он не будет бить onMessageReceived, и уведомление будет обрабатываться самим андроидом и будет отображаться в лотке уведомлений (без вашего клиентского приложения). И если мы отправляем без объекта уведомления, но объект данных есть, он всегда будет нажимать наMessageReceived. –

Смежные вопросы