如何完全取消订阅推送通知?

时间:2019-05-24 17:18:44

标签: android push-notification firebase-cloud-messaging

在我的应用程序中,我已经实现了推送通知功能。 我为用户添加了一个按钮,该按钮使他可以完全关闭通知。但是,它不起作用,正如我所期望的那样。这是代码段:

来自MainActivity:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

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

        ((SwitchCompat)findViewById(R.id.notification_switch)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                if(isChecked) {
                    Toast.makeText(MainActivity.this, "Switch activated ", Toast.LENGTH_LONG).show();
                    FirebaseMessaging.getInstance().subscribeToTopic("test_topic");
                }else {
                    Toast.makeText(MainActivity.this, "Switch deactivated ", Toast.LENGTH_LONG).show();
                    FirebaseMessaging.getInstance().unsubscribeFromTopic("test_topic");

                        new Thread(new Runnable() {
                            @Override
                            public void run() {
                                try {
                                    FirebaseInstanceId.getInstance().deleteInstanceId();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                            }
                        }).start();
                }
            }
        });
}

FirebaseMessagingService类来处理消息:

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    public static String TAG = MyFirebaseMessagingService.class.getName();
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage){
        super.onMessageReceived(remoteMessage);
        Log.e(TAG, "onMessageReceived() --> " + remoteMessage.getNotification().getTitle());

    }

//    @Override
//    public void onNewToken(String s) {
//        super.onNewToken(s);
//        Log.e(TAG, "onNewToken() --> " + s);
//    }

}

当我尝试使用主题发送通知时,没有任何通知。如果我将通知发送到带有该应用程序的所有设备,则仍然会收到通知。如何完全阻止我的应用收到通知?

2 个答案:

答案 0 :(得分:0)

取消注册和取消订阅

客户端应用程序可以使用三种方法来停止从应用程序服务器接收消息和/或主题订阅:

InstanceID deleteToken(),其中受众设置为应用服务器的发送者ID,范围设置为GCM。这样可以停止来自特定应用服务器的消息(包括主题消息)

InstanceID deleteID()。这将停止所有应用服务器的所有先前注册和主题订阅的消息

GCMPubSub unsubscribe()。这样可以停止来自应用服务器特定主题的主题消息

对于FCM,它应该是FirebaseInstanceId。

答案 1 :(得分:0)

尝试在4之前设置setAutoInitEnabled(false)。 启用后,如果没有有效的令牌,FCM将在应用启动时生成一个注册令牌,并在删除该令牌时生成一个新令牌((这可防止deleteInstanceId()停止定期发送数据/ strong>)。此设置会在应用重新启动时保持不变,并会覆盖清单中指定的设置。

默认情况下,启用了FCM自动初始化

有关更多信息:FirebaseMessaging