1

Ich verwende Firebase-Benachrichtigungen, um Benutzer über neue Daten zu informieren, die in der App gepostet wurden. Ich folge dem hier gegebenen Beispiel: https://github.com/firebase/quickstart-android/tree/master/messagingWie wird die Firebase-Benachrichtigung nur verschoben, wenn CheckBoxPreference aktiviert ist?

Obwohl ich auch den Benutzer bevorzugen. Sie sollten nur benachrichtigt werden, wenn sie sich dafür entschieden haben, benachrichtigt zu werden, indem sie das CheckBoxPreference überprüfen.

Ich habe die CheckBoxPreference und auch die onPreferenceChangeListener erfolgreich eingestellt. Das Problem ist, dass der Benutzer die Benachrichtigung erhält, selbst wenn die CheckBox deaktiviert ist.

Hier ist, was ich in SettingsActivity getan haben:

public class SettingsActivity extends PreferenceActivity { 

    private AppCompatDelegate mDelegate; 

    Preference myPref; 

    boolean isChecked = true; 

    private static final String TAG = "SettingsActivity"; 

    public static final String RECEIVE_NOTIFS = "receiveNotifications"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     getDelegate().installViewFactory(); 
     getDelegate().onCreate(savedInstanceState); 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 

     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

     myPref = (CheckBoxPreference) findPreference(RECEIVE_NOTIFS); 
     myPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 
      @Override 
      public boolean onPreferenceChange(Preference preference, Object o) { 
       isChecked = Boolean.valueOf(o.toString()); 
       if (isChecked) { 
        Toast.makeText(getBaseContext(), "Checked", Toast.LENGTH_SHORT).show(); 
        if (getIntent().getExtras() != null) { 
         String remoteMessage = getIntent().getExtras().getString("remoteMessage"); 
         sendNotification(remoteMessage); 
        } else { 
         Toast.makeText(getBaseContext(), "Error!", Toast.LENGTH_SHORT).show(); 
        } 
       } else { 
        Toast.makeText(getBaseContext(), "Unchecked", Toast.LENGTH_SHORT).show(); 
       } 
       return true; 
      } 
     }); 

    } 

    public void sendNotification(String messageBody) { 
     Intent intent = new Intent(this, SettingsActivity.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, 
       PendingIntent.FLAG_ONE_SHOT); 

     Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
     NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
       .setSmallIcon(R.mipmap.ic_launcher) 
       .setContentTitle("FCM Message") 
       .setContentText(messageBody) 
       .setAutoCancel(true) 
       .setSound(defaultSoundUri) 
       .setContentIntent(pendingIntent); 

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

     notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); 
    } 

ich in obigen Code eindeutig angegeben haben, dass Benachrichtigung sollte nur dann gesendet werden, wenn CheckBoxPreference geprüft.

Hier MyFirebaseMessagingService.java Code der Datei:

public class MyFirebaseMessagingService extends FirebaseMessagingService { 

    private static final String TAG = "MyFirebaseMsgService"; 

    /** 
    * Called when message is received. 
    * 
    * @param remoteMessage Object representing the message received from Firebase Cloud Messaging. 
    */ 
    // [START receive_message] 
    @Override 
    public void onMessageReceived(RemoteMessage remoteMessage) { 
     // TODO(developer): Handle FCM messages here. 
     // If the application is in the foreground handle both data and notification messages here. 
     // Also if you intend on generating your own notifications as a result of a received FCM 
     // message, here is where that should be initiated. See sendNotification method below. 
     Log.d(TAG, "From: " + remoteMessage.getFrom()); 
     Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody()); 

     Intent intent = new Intent(this, SettingsActivity.class); 
     intent.putExtra("remoteMessage", remoteMessage.getNotification().getBody()); 
     startActivity(intent); 
    } 
    // [END receive_message] 

} 

Was ich tue, ist hier ich remoteMessage als Intent sende an die SettingsActivity und es in sendNotification() Verfahren dort verwendet wird.

Also, was ich will ist, dass ich möchte, dass der Benutzer nur benachrichtigt wird, wenn sie gewählt haben, indem Sie die CheckBoxPreference überprüfen.

Bitte lassen Sie mich was mache ich hier falsch.

+0

wo senden Sie eine Benachrichtigung aus? die Konsole? – Shubhank

+0

@Subhank Ich habe dich nicht bekommen. Es tut uns leid. Bitte sag das noch deutlicher. –

+0

"Ich verwende Benachrichtigungen, um Benutzer zu benachrichtigen", wie werden Sie die Benutzer benachrichtigen? Ich denke, mit benutzerdefinierten Server oder Firebase-Konsole – Shubhank

Antwort

2

Wenn Sie Firebase-Benachrichtigungen verwenden, handelt es sich bei der gesendeten Nachricht um eine Benachrichtigung. Wenn die App im Vordergrund ist, verarbeitet Ihr Code die Benachrichtigung. Wenn die App jedoch im Hintergrund läuft, wird sie vom Standardbenachrichtigungscenter gehandhabt. Und da das Benachrichtigungszentrum nichts von Ihrer Checkbox weiß, wird immer die Benachrichtigung angezeigt.

Sehen Sie diese Antwort auf eine Frage auf der Quickstart-Repo für die beste Erklärung, die ich bisher gesehen habe: https://github.com/firebase/quickstart-android/issues/8#issuecomment-221039175

Sie ein paar Optionen Ihre Logik Funktion zu erhalten:

  • don‘ t Senden Sie eine Benachrichtigung, wenn der Benutzer das Kontrollkästchen nicht aktiviert hat. Anstatt die Anzeige zu unterdrücken, senden Sie sie einfach nicht. Zum Beispiel könnten Sie wahrscheinlich ein Thema senden, zu dem nur angemeldete Nutzer Abonnenten sind.

  • senden Sie eine Datennachricht anstelle einer Benachrichtigung. Dadurch wird sichergestellt, dass Ihr Code immer aufgerufen wird, selbst wenn die App im Hintergrund läuft. Weitere Informationen zum Unterschied zwischen Benachrichtigungen und Datennachrichten finden Sie in der Dokumentation zu Notifications and data in the message payload.

Verwandte Fragen:

+0

vielen Dank für die Beseitigung der Zweifel. Kannst du mir bitte sagen, wie ich eine Datennachricht anstelle einer Benachrichtigung senden soll? Danke nochmal! –

+0

Weitere Informationen finden Sie unter https://firebase.google.com/docs/cloud-messaging/downstream –