3

我已经在我的应用程序中通过Firebase实施了推送通知。即使通知已从设置中禁用,通知即将到来。 我为火力地堡实施的类别是:通过应用程序设置中的切换按钮启用或禁用FCM推送通知

public class MyFirebaseMessagingService extends FirebaseMessagingService { 

      private static final String TAG = "MyFirebaseMsgService"; 
      @Override 
      public void onMessageReceived(RemoteMessage remoteMessage) { 

       //Displaying data in log 

       Log.e(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody()); 
       //Calling method to generate notification 

       String to=""; 
       to = remoteMessage.getData().get("key1"); 

     //when the notification is disabled then also the notification is coming 
    if(notification_enable) { 
    sendNotification(remoteMessage.getNotification().getTitle(),remoteMessage.getNotification().getBody(),to); 
      } 
     } 

      //This method is only generating push notification 
      //It is same as we did in earlier posts 
      private void sendNotification(String title,String messageBody,String to) { 
        Intent intent = new Intent(this, Splash_Activity.class); 
        intent.putExtra("key1",to); 
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 


       PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT); 

       Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
       NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
         .setSmallIcon(R.drawable.noti_icon) 
         .setContentTitle(title) 
         .setStyle(new NotificationCompat.BigTextStyle().bigText(messageBody)) 
         .setContentText(messageBody) 
         .setAutoCancel(true) 
         .setColor(this.getResources().getColor(R.color.colorAccent)) 
         .setSound(defaultSoundUri) 
         .setContentIntent(pendingIntent); 

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

       notificationManager.notify(0, notificationBuilder.build()); 
      } 
     } 
public class FirebaseIDService extends FirebaseInstanceIdService { 
    private static final String TAG = "FirebaseIDService"; 

    @Override 
    public void onTokenRefresh() { 
     // Get updated InstanceID token. 
     String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 
     Log.e(TAG, "Refreshed token: " + refreshedToken); 

     // TODO: Implement this method to send any registration to your app's servers. 
     sendRegistrationToServer(refreshedToken); 
    } 

    /** 
    * Persist token to third-party servers. 
    * 
    * Modify this method to associate the user's FCM InstanceID token with any server-side account 
    * maintained by your application. 
    * 
    * @param token The new token. 
    */ 
    private void sendRegistrationToServer(String token) { 
     // Add custom implementation, as needed. 
    } 
} 

而且在清单包含的类如:

<permission 
     android:name="com.pixelpoint.permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 

    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
    <uses-permission android:name="com.pixelpoint.permission.C2D_MESSAGE" /> 

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

回答

4

你发送使用火力地堡控制台的通知? 如果应用程序在后台并且您的MyFirebaseMessagingService不会收到回叫,系统将处理这些通知。客户端检查用户是否在本地设置中注册以接收通知的代码不适用于所有情况。 (更多关于此https://firebase.google.com/docs/cloud-messaging/android/receive后台处理)

我对这个建议是建立一个主题,并自动注册用户后直接订阅用户到该主题:当用户切换通知

FirebaseMessaging.getInstance().subscribeToTopic("news"); 

然后关闭,退订主题。

FirebaseMessaging.getInstance().unsubscribeFromTopic("news"); 

这将从服务器上的列表中删除它们,并且您不会依赖客户端逻辑来过滤掉不需要的通知。

然后,当从Firebase控制台向客户端发送通知时,您应该仅针对那些注册该主题的用户

更多主题讯息在这里 - https://firebase.google.com/docs/cloud-messaging/android/topic-messaging

+0

这是什么(“新闻”),它是强制性的还是不是? – user6789978

+0

@ user6789978这是我正在使用的示例主题,您可以使用与您的应用程序相关的任何主题名称。 – riggaroo