FCM не работает, когда приложение убито - PullRequest
0 голосов
/ 05 апреля 2020

Я использую fcm для отправки уведомлений в свое приложение, но когда приложение закрыто и очищено от последних приложений, уведомление не приходит. Я использую API FCM для отправки уведомления на определенную страницу c. Примечание: - Когда приложение работает в фоновом режиме, уведомление работает нормально

Это мой код FirebaseMessagingService

@RequiresApi(api = Build.VERSION_CODES.O)

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {


    String title = remoteMessage.getNotification().getTitle();
    String body = remoteMessage.getNotification().getBody();

    Map<String, String> extraData = remoteMessage.getData();

 Log.d("DATA",remoteMessage.getData().toString());

    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(this, "TAC")
                    .setContentTitle(title)
                    .setContentText(body)
                    .setSmallIcon(R.drawable.ic_launcher_background);





    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);


    int id =  (int) System.currentTimeMillis();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
        NotificationChannel channel = new NotificationChannel("TAC","demo",NotificationManager.IMPORTANCE_HIGH);
        notificationManager.createNotificationChannel(channel);
    }
    notificationManager.notify(id,notificationBuilder.build());

}

}

это код класса отправителя уведомления

publi c class NotificationSender {

public  static RequestQueue mRequest;
public static String URL="https://fcm.googleapis.com/fcm/send";

public static void sendnotification(Context context,String sendto, String title, JSONObject extra){
    mRequest = Volley.newRequestQueue(context);
    JSONObject mainbody = new JSONObject();
    try {
        mainbody.put("to","/topics/"+sendto);
          mainbody.put("priority","high");
        JSONObject notification = new JSONObject();
        notification.put("title","New Notification");
        notification.put("body",title);
        mainbody.put("notification",notification);
          //  mainbody.put("data",extra);
            JSONObject data = new JSONObject();
            data.put("key",title);
            mainbody.put("data",data);


        JsonObjectRequest request=new JsonObjectRequest(Request.Method.POST, URL, mainbody, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        }){
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String,String> header = new HashMap<>();
                header.put("content-type","application/json");
                header.put("authorization","key=AIzaSyAfZqD0MW39WIGRBDFG0si3-HszFA");
               // AIzaSyAfZqD0MW39WIu9pWraYA0AG0si3-HszFA
                return header;
            }
        };
        mRequest.add(request);
    } catch (JSONException e) {
        e.printStackTrace();
    }






}

}

И это мой код для отключения оптимизации батареи

 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        final Intent intent = new Intent();
        final String packageName = getPackageName();
        PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
        if (!pm.isIgnoringBatteryOptimizations(packageName)) {
            AlertDialog ad= new AlertDialog.Builder(this).setTitle("IMPORTANT").setMessage("For The Proper Working Of The App,Please Disable Battery Optimization For This App").setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
                    intent.setData(Uri.parse("package:" + packageName));
                    startActivity(intent);

                }
            }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    finishAffinity();
                    System.exit(0);
                }
            }).create();
            ad.show();
        }
    }

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Многие китайские производители убивают фоновые сервисы приложения для экономии заряда батареи. Работа вашей службы уведомлений является основной для получения уведомлений pu sh. Однако, если вы можете удалить свое приложение из оптимизации батареи в Настройках, вы получите уведомления pu sh, когда ваше приложение находится в фоновом режиме или вы убили приложение. Это может показаться глупым, но когда у меня возникла та же проблема, я удалил свое приложение из оптимизации батареи, и оно заработало!

0 голосов
/ 05 апреля 2020

Вот так:

mainbody.put("to","/topics/"+sendto);
mainbody.put("priority","high");
JSONObject data = new JSONObject();
data("title","New Notification");
data("body",title);
mainbody.put("data",data);

и

Map<String, String> extraData = remoteMessage.getData();

String title = extraData.get("title");
String body = extraData.get.get("body");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...