问题
im using firebase push notification(FCM)..and i want to enable and disable notifications by switch button
for that i have shared preferences to enable and disable notifications but it seems my logic is not at all working
if turn on and off switch still it is receiving notifications
need help thanks
activity:--
val sharedPreferences = getSharedPreferences("myname", MODE_PRIVATE)
simpleSwitch.setChecked(sharedPreferences.getBoolean("SWITCH_PARTIDOS_STATE", false))
simpleSwitch.setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener { buttonView, isChecked ->
sharedPreferences.edit().putBoolean("SWITCH_PARTIDOS_STATE", isChecked).commit()
if (isChecked) {
// FirebaseMessaging.getInstance().subscribeToTopic("Partidos")
Toast.makeText(applicationContext, "Activado Correctamente",
Toast.LENGTH_LONG).show()
} else {
// FirebaseMessaging.getInstance().unsubscribeFromTopic("Partidos")
Toast.makeText(applicationContext, "Desactivado Correctamente",
Toast.LENGTH_LONG).show()
}
PreferenceHelper.prefernceHelperInstace.setBoolean(applicationContext, Constants.MessageNotificationKeys.ENABLE_NOTIFICATION, true);
})
firebasemessagingservice:---
override fun onMessageReceived(remoteMessage: RemoteMessage) {
super.onMessageReceived(remoteMessage)
if (PreferenceHelper.prefernceHelperInstace.getBoolean(getApplicationContext(),
Constants.MessageNotificationKeys.ENABLE_NOTIFICATION, true)
) {
Log.d("msg", "onMessageReceived: " + remoteMessage.notification?.body)
val intent = Intent(this, HomeActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
val pendingIntent =
PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT)
val channelId = "Default"
val builder: NotificationCompat.Builder = NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(remoteMessage.getNotification()?.getTitle())
.setContentText(remoteMessage.getNotification()?.getBody()).setAutoCancel(true)
.setContentIntent(pendingIntent)
.setStyle(NotificationCompat.BigTextStyle()
.bigText(remoteMessage.getNotification()?.getBody()))
val manager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager?
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel(
channelId,
"Default channel",
NotificationManager.IMPORTANCE_DEFAULT
)
manager!!.createNotificationChannel(channel)
}
manager!!.notify(0, builder.build())
}
else {
Log.e("TAG", "ReactFireBaseMessagingService: Notifications Are Disabled by User");
}
}
preferencehelper:--
class PreferenceHelper private constructor() {
fun setBoolean(appContext: Context?, key: String?, value: Boolean?) {
PreferenceManager.getDefaultSharedPreferences(appContext).edit()
.putBoolean(key, value!!).apply()
}
fun getBoolean(
appContext: Context?, key: String?,
defaultValue: Boolean?
): Boolean {
return PreferenceManager.getDefaultSharedPreferences(appContext)
.getBoolean(key, defaultValue!!)
}
fun getInteger(appContext: Context?, key: String?, defaultValue: Int): Int {
return PreferenceManager.getDefaultSharedPreferences(appContext)
.getInt(key, defaultValue)
}
companion object {
val prefernceHelperInstace = PreferenceHelper()
}
}
using the method of topic(need help ):---------
val sharedPreferences = getSharedPreferences("myname", MODE_PRIVATE)
simpleSwitch.setChecked(sharedPreferences.getBoolean("SWITCH_STATE", false))
simpleSwitch.setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener { buttonView, isChecked ->
sharedPreferences.edit().putBoolean("SWITCH_STATE", isChecked).commit()
if (isChecked) {
// FirebaseMessaging.getInstance().subscribeToTopic("Partidos")
FirebaseMessaging.getInstance().subscribeToTopic("main_notification");
Toast.makeText(applicationContext, "enabled notification",
Toast.LENGTH_LONG).show()
}
else {
FirebaseMessaging.getInstance().unsubscribeFromTopic("main_notification");
Toast.makeText(applicationContext, "disabled notification",
Toast.LENGTH_LONG).show()
}
})
the problem of this code is it doesnt worked at first(it recieves notification at on off both) after switching on off (switching buttons) it works(when on recives notification and off doesnt recive)
need help
回答1:
FirebaseMessagingService
runs in the background even when the app's not in the foreground so you won't be able to get the preferences using applicationContext
.
You should use Topic messaging - https://firebase.google.com/docs/cloud-messaging/android/topic-messaging
Use this in your switch's change listener:
To enable push notifications -
FirebaseMessaging.getInstance().subscribeToTopic("your_topic");
To disable push notifications -
FirebaseMessaging.getInstance().unsubscribeFromTopic("your_topic");
This way you will notify Firebase that you don't want to get notifications about a particular topic.
来源:https://stackoverflow.com/questions/65424508/push-notification-enable-and-disable-by-using-switch