问题描述
我正在使用 broadcastReceiver
发送广播以在服务销毁时重新启动 FirebaseMessagingService
。但是,以这种方式启动服务时,FirebaseMessagingService
会立即销毁。当服务被销毁时,我会向接收者发送另一个广播,循环无限期地继续。
我的 FirebaseMessagingService
代码。
@AndroidEntryPoint
class MessagingService :
FirebaseMessagingService(),FirebaseAuth.AuthStateListener {
companion object {
var isRunning = false
const val REQUEST_CODE = 0
const val NOTIFICATION_ID = 0
}
@Inject
lateinit var notificationRepository: NotificationRepository
@Inject
lateinit var authRepository: AuthRepository
override fun onCreate() {
super.onCreate()
Log.d("MessagingService","I am created")
isRunning = true
FirebaseAuth.getInstance().addAuthStateListener(this)
}
override fun onDestroy() {
super.onDestroy()
Log.d("MessagingService","I am destroyed")
isRunning = false
FirebaseAuth.getInstance().removeAuthStateListener(this)
val intent = Intent()
intent.action = "restartMessagingService"
intent.setClass(this,MessagingServiceRestarter::class.java)
this.sendbroadcast(intent)
}
override fun onMessageReceived(remoteMessage: RemoteMessage) {
val title = remoteMessage.notification?.title
val message = remoteMessage.notification?.body
if (message != null && title != null) {
sendPushNotification(title,message)
}
}
override fun onNewToken(token: String) {
savetokenToSharedPreferences(token)
authRepository.getUser()?.let {
val uid = it.uid
sendTokenToFirestore(uid,token)
}
}
override fun onAuthStateChanged(auth: FirebaseAuth) {
auth.currentUser?.let {
val uid = it.uid
val savedRegistrationToken =
PreferenceManager.getDefaultSharedPreferences(this)
.getString(getString(R.string.fcm_token_shared_pref_key),"")
savedRegistrationToken?.let { token -> sendTokenToFirestore(uid,token) }
}
}
private fun sendPushNotification(title: String,messageBody: String) {
val intent = Intent(this,MainActivity::class.java)
val pendingIntent = PendingIntent.getActivity(this,REQUEST_CODE,intent,PendingIntent.FLAG_UPDATE_CURRENT)
val channelId = getString(R.string.general_notification_channel_id)
val defaultSoundUri = ringtoneManager.getDefaultUri(ringtoneManager.TYPE_NOTIFICATION)
val notificationBuilder = NotificationCompat.Builder(this,channelId)
.setSmallIcon(R.drawable.mlearn_logo)
.setContentTitle(title)
.setContentText(messageBody)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent)
val notificationmanager = getSystemService(Context.NOTIFICATION_SERVICE) as notificationmanager
val channel = NotificationChannel(
channelId,getString(R.string.general_notification_channel_name),notificationmanager.IMPORTANCE_DEFAULT
)
notificationmanager.createNotificationChannel(channel)
notificationmanager.notify(NOTIFICATION_ID,notificationBuilder.build())
}
private fun savetokenToSharedPreferences(token: String) {
val sharedPref = PreferenceManager.getDefaultSharedPreferences(this)
with (sharedPref.edit()) {
putString(getString(R.string.fcm_token_shared_pref_key),token)
apply()
}
}
private fun sendTokenToFirestore(uid: String,token: String) {
GlobalScope.launch(dispatchers.IO) {
notificationRepository.sendNotificationToken(uid,token)
}
}
}
我的接收器代码。
class MessagingServiceRestarter : broadcastReceiver() {
override fun onReceive(context: Context,intent: Intent) {
Log.d("MessagingService","Restarter" + MessagingService.isRunning.toString())
if (!MessagingService.isRunning) {
context.startService(Intent(context,MessagingService::class.java))
MessagingService.isRunning = true
}
}
}
每次创建 MainActivity
时我都会启动我的服务。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("MessagingService","MainActivity" + MessagingService.isRunning.toString())
if (!MessagingService.isRunning) {
val intent = Intent(this,MessagingService::class.java)
startService(intent)
MessagingService.isRunning = true
}
}
override fun onDestroy() {
val intent = Intent()
Log.d("MessagingService","MainActivity" + MessagingService.isRunning.toString())
intent.action = "restartMessagingService"
intent.setClass(this,MessagingServiceRestarter::class.java)
sendbroadcast(intent)
super.onDestroy()
}
我已经在清单上注册了我的服务和接收器。
<service
android:name=".service.MessagingService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<receiver
android:name=".receiver.MessagingServiceRestarter"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="restartMessagingService"></action>
</intent-filter>
</receiver>
如何保持我的 FirebaseMessagingService
运行?我正在使用此接收器在服务停止时重新启动服务,因为该应用已从最近的应用中清除。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)