如果应用被刷卡杀死,如何停止所有通知和警报?

时间:2019-07-02 09:11:30

标签: android kotlin android-service android-notifications android-alarms

我想取消在后台设置的所有通知和警报,因为应用被刷卡杀死了。此操作不会触发我的根onDestroy()内部的Activity

我提供了一项后台服务,以致电NotificationManager并取消后台的所有通知(如果应用被刷卡杀死)。这导致Android O及更高版本中的服务出现一些问题。我发现您必须以其他方式启动服务,但是此服务启动将使我的应用崩溃 错误:Reason: Context.startForegroundService() did not then call Service.startForeground()

我还没有解决方案如何在后台取消我所有的Alarms,但是此后台服务对于项目后期服务器发出的推送通知非常重要。(无主题)

Application类中初始化服务:

private fun initBackgroundService(){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            startForegroundService(Intent(this, AppService::class.java))
        } else {
            startService(Intent(this, AppService::class.java))
        }
    }

AppService类:

import android.app.NotificationManager
import android.app.Service
import android.content.Context
import android.content.Intent
import android.os.IBinder

    class AppService: Service(){

        override fun onBind(intent: Intent?): IBinder? {
            return null
        }


        override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
            return START_STICKY
        }

        override fun onTaskRemoved(rootIntent: Intent?) {
            super.onTaskRemoved(rootIntent)
            val nManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            nManager.cancelAll()
            stopSelf()
        }

    }

1 个答案:

答案 0 :(得分:0)

将后台任务保留在变量中,并尝试在“活动”的yourVariable.stop()方法中调用onStop()

class YourClass() {
    var myService : Intent? = null

    override fun onCreate() {
        myService = Intent(this, AppService::class.java)
        // do your stuff here
    }

    override fun onStop() {
        myService?.stop() // Or any 'cancel' or 'stop' method in your service
    }
}