通过从应用程序设置切换按钮来启用或禁用FCM推送通知

时间:2017-01-02 13:23:44

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

我已在我的应用中通过Firebase实施了推送通知。即使从设置中禁用通知,通知也会到来。 我为Firebase实施的课程是:

    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>

1 个答案:

答案 0 :(得分:11)

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

我的建议是创建一个主题,并在注册用户后直接自动订阅该主题:

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

然后,当用户切换关闭通知时,请取消订阅主题。

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

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

然后,当从Firebase Console向客户端发送通知时,您应该仅定位为该主题注册的用户

有关Topic Messaging的更多信息,请访问https://firebase.google.com/docs/cloud-messaging/android/topic-messaging