После повторного открытия приложения создается несколько экземпляров службы - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь создать приложение для обновления постоянного уведомления, даже когда приложение закрыто. Прямо сейчас я использую сервис, который запускается в onCreate () MainActivity:

serviceIntent = Intent(this, PersistentService::class.java)
val stopped = stopService(serviceIntent)
println("[123] stopped: $stopped")
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    startForegroundService(serviceIntent)
} else {
    startService(serviceIntent)
}

Это прекрасно работает, чтобы начать. Однако, когда я снова открываю и закрываю приложение, даже если остановлено: напечатано true, предыдущий сервис все еще работает, а предыдущий сервис stopService () не был вызван.

Урезанная версия класса PersistentService:

var timesStarted = 0
var lastService: PersistentService? = null

class PersistentService: Service(){
    private var timer: Timer? = null
    private var task: AsyncTask<*, *, *>? = null

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

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        timesStarted++
        println("[123]starting persistent service. timesStarted: $timesStarted lastService===this: ${lastService===this} lastService==this: ${lastService==this} lastService: $lastService")
        println("[123] hashCode: ${hashCode()}")
        lastService = this
        if(timer == null){
            timer = Timer()
        }
        setToLoadingNotification()
        timer?.scheduleAtFixedRate(object : TimerTask(){
            override fun run(){
                println("[123]Updating hashCode: ${this@PersistentService.hashCode()}")
                if(task?.status == AsyncTask.Status.RUNNING){
                    // send notification saying last request timed out
                }
                task?.cancel(true)

                task = DataUpdaterTask(DatabaseDataRequester { GlobalData.connectionProperties }) { dataRequest ->
                    // send notification based on dataRequest value
                }.execute()
            }
        }, 1000L, UPDATE_PERIOD)
        return START_STICKY
    }

    private fun notify(notification: Notification){
        getManager().notify(NOTIFICATION_ID, notification)
        startForeground(NOTIFICATION_ID, notification)
    }
    private fun getBuilder(): Notification.Builder {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
            return Notification.Builder(this, NotificationChannels.PERSISTENT_STATUS.id)
        }
        return Notification.Builder(this)
    }
    private fun getManager() = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

    override fun stopService(name: Intent?): Boolean {
        println("[123]Stopping persistent service")
        timer?.cancel() // stop the timer from calling the code any more times
        task?.cancel(true) // stop the code from running if it's running
//        getManager().cancel(NOTIFICATION_ID)
        return super.stopService(name)
    }
}

Вот вывод

[123] stopped: false
[123]starting persistent service. timesStarted: 1 lastService===this: false lastService==this: false lastService: null
[123] hashCode: 4008007
[123]Updating hashCode: 4008007
[123]Got successful data request
[123]Updating hashCode: 4008007
[123]Got successful data request
// *close and reopen the app*
[123] stopped: true
[123]starting persistent service. timesStarted: 2 lastService===this: false lastService==this: false lastService: me.retrodaredevil.solarthing.android.PersistentService@3d2847
[123] hashCode: 7823272
[123]Updating hashCode: 7823272
[123]Got successful data request
[123]Updating hashCode: 4008007
[123]Got successful data request
[123]Updating hashCode: 7823272
[123]Got successful data request

Как видно из выходных данных, обе службы работают одновременно. Хэш-код показывает, что они не являются одним и тем же объектом, поэтому не имеет значения, если я добавлю свой код в onCreate () вместо onStartCommand () (я все равно уже проверял это)

Было бы полезно, если бы кто-нибудь мог указать мне правильное направление. Я новичок в разработке Android, и у меня были проблемы с поиском правильного способа сделать это. Я даже не уверен, что то, что я делаю сейчас, - лучший способ обновить уведомление.

1 Ответ

0 голосов
/ 19 ноября 2018

и предыдущий сервис stopService () не был вызван.

stopService() не является методом жизненного цикла Service.Возможно, вы думаете о onDestroy().

, предыдущая служба все еще работает

Нет, предыдущий экземпляр службы был остановлен.Вы только что слили Timer, потому что вы не отменили Timer в onDestroy().

Итак, переопределите onDestroy(), вставьте туда свои cancel() вызовы, избавьтесь от остальной частиstopService(), и вы должны быть в лучшей форме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...