简体   繁体   English

当应用程序被杀死时,FCM 不工作

[英]FCM is not working when the app is killed

I am using fcm to puch notification in my app but when the app is closed and cleared from recent apps then notification is not coming.I ma using FCM api to send notification to a particular topic.我正在使用 fcm 在我的应用程序中发送通知,但是当应用程序关闭并从最近的应用程序中清除时,通知不会到来。我可以使用 FCM api 向特定主题发送通知。 Note:- When the app is in background the notification is working fine注意:- 当应用程序在后台时,通知工作正常

This is my FirebaseMessagingService Code这是我的 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());

}

} }

this is Notification Sender class code这是通知发送方 class 代码

public class NotificationSender {公共 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();
    }






}

} }

And This is my code to turn off battery optimization这是我关闭电池优化的代码

 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();
        }
    }

Many Chinese manufacturers kill the app's background services for saving battery.许多中国制造商为了节省电池而关闭了该应用程序的后台服务。 The running of your notification service is primary to receive push notifications.通知服务的运行是接收推送通知的主要方式。 However, if you can remove your app from battery optimization in Settings, you'll receive push notifications when your app is in the background or you've killed the app.但是,如果您可以在“设置”中将您的应用从电池优化中删除,那么当您的应用处于后台或您已终止该应用时,您将收到推送通知。 This might look like its silly, but when I had the same issue I removed my app from battery optimization and it worked!这可能看起来很傻,但是当我遇到同样的问题时,我从电池优化中删除了我的应用程序并且它起作用了!

Like this:像这样:

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

and

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

String title = extraData.get("title");
String body = extraData.get.get("body");

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM