FirebaseMessagingService 创建后立即销毁

问题描述

我正在使用 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...