Лучший способ многократно запускать одну и ту же функцию в IntentService - PullRequest
0 голосов
/ 07 марта 2020

Мое приложение выполняет довольно простую задачу - оно собирает cellInfo, извлекает номер cid вышки сотовой связи и помещает его в основное действие, когда есть текстовое представление с каким-либо журналом идентификаторов ячеек. Каждый клетид собирает один раз в 2 секунды. Эта функция хранится в Intent Service, а также каждый раз, когда пользователь начинает регистрироваться, появляется уведомление.

Недавно я обнаружил, что, несмотря на то, что в текущем состоянии есть Thread.sleep(1000L) l oop Некоторые смартфоны не поддерживают работу сервиса корректно. Т.е. когда я выключаю экран, Служба намерений перестает работать, но уведомление все еще присутствует. Иногда я замечал, что некоторые телефоны запускают функцию получения сотовых телефонов намного медленнее, игнорируя метод сна. Но когда я запускаю приложение с подключенным зарядным устройством, все работает нормально на каждом телефоне. Не уверен, что это все о зарядке, но мне нужно, чтобы задержка была одинаковой на нескольких телефонах.

Вот что я пробовал.

Работает на разных телефонах на разных скоростях

fun counter(bc: Intent){
    val tm = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
    var quit = 0
    var i = 0
    do {
        i += 1
        quit = Trigger.getTrigger() // companion object 
        val num_cid = getcids(tm) // function that takes cell tower cid (int)
        bc.putExtra(PARAM_OUT_MSG, num_cid .toString()) // sending cid to broadcastIntent
        sendBroadcast(bc) 
        Thread.sleep(1000)
    }
    while (quit == 0)
}

Работает лучше, но уведомление не появляется .

fun counter(bc: Intent){
    val tm = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
    Handler().postDelayed(object : Runnable {
        override fun run() {
            if (Trigger.getTrigger() == 0) {
                i += 1
                val num_cid = getcids(tm)
                bc.putExtra(CURRENT_CID, num_cid .toString())
                sendBroadcast(bc)
                handler.postDelayed(this, 1000)
            }
        }
    }, 0)
}

Что нужно сделать здесь, чтобы обеспечить одинаковую скорость на каждом телефоне и представленном уведомлении?

1 Ответ

0 голосов
/ 08 марта 2020

Итак, в последних обновлениях системы Google специально сделал ограничение на фоновые сервисы . Система в конечном итоге убьет ваше приложение, если оно будет работать только в фоновом режиме. Чтобы преодолеть эти ограничения, используются приоритетные службы или Job Scheduler .

...