Я знаю, что уже слишком поздно делиться ответом, но я вставлю здесь свои пять копеек, потому что это очень и очень важно. Я потратил свои 2 дня на выкапывание этой проблемы. Я пробовал все предложенные решения, представленные здесь, но ничего не работало. Ниже приведено решение, которое я реализовал в следующие шаги:
Шаг № 01 Создайте свою службу переднего плана, как вы это делаете, и зарегистрируйте ее соответствующим образом в манифесте. В качестве образца я делюсь образцом обслуживания.
class MyService : Service() {
private var wakeLock: PowerManager.WakeLock? = null
override fun onBind(intent: Intent): IBinder? {
Log.d(tag!!, "Some component want to bind with the service")
// We don't provide binding, so return null
return null
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.d(tag!!, "onStartCommand executed with startId: $startId")
// by returning this we make sure the service is restarted if the system kills the service
return START_STICKY
}
override fun onCreate() {
super.onCreate()
Log.d(tag!!, "The service has been created".toUpperCase(Locale.ROOT))
startForeground(1, NotificationUtils.createNotification(this))
acquireLock()
}
override fun onDestroy() {
super.onDestroy()
Log.d(tag!!, "The service has been destroyed".toUpperCase(Locale.ROOT))
Toast.makeText(this, "Service destroyed", Toast.LENGTH_SHORT).show()
}
override fun onTaskRemoved(rootIntent: Intent?) {
Log.d(tag!!, "onTaskRemoved")
val restartServiceIntent = Intent(applicationContext, this.javaClass)
restartServiceIntent.setPackage(packageName)
val restartServicePendingIntent = PendingIntent.getService(applicationContext, 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT)
val alarmService = applicationContext.getSystemService(ALARM_SERVICE) as AlarmManager
alarmService[AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 1000] = restartServicePendingIntent
super.onTaskRemoved(rootIntent)
}
@SuppressLint("WakelockTimeout")
private fun acquireLock() {
// we need this lock so our service gets not affected by Doze Mode
wakeLock =
(getSystemService(Context.POWER_SERVICE) as PowerManager).run {
newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyService::lock").apply {
acquire()
}
}
}
}
ПРИМЕЧАНИЕ. Я рассмотрел все возможные варианты использования для перезапуска службы в случае, если она будет убита ОС. Остается одно, если пользователь перезапустит мобильный телефон. Этот случай можно легко найти с помощью других ответов stackoverflow. В Broadcast нужно просто запустить Service.
Шаг № 02 Создайте заявку и зарегистрируйтесь в манифесте. И добавьте ниже строку кода в свой класс приложения.
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
val receiver = ComponentName(this, MyService::class.java)
val pm = packageManager
pm.setComponentEnabledSetting(
receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP
)
}
}
Здесь MyService — это имя компонента, и это может быть Service или Broadcast Receiver, который вы уже используете в своем приложении. В моем случае я пытаюсь использовать службу Android
Теперь пришло время зарегистрировать этот класс приложения в файле манифеста. Откройте файл манифеста и в теге приложения используйте свойство name и поместите имя только что созданного класса приложения MyApplication.
Шаг № 03 Третьего шага нет. Вы сделали. Вы просто устанавливаете apk, и таким образом служба не будет убита, даже если приложение будет убито. Я протестировал вышеуказанное решение на устройстве Vivo, и оно сработало.
ПРИМЕЧАНИЕ. В случае, если вышеуказанное решение не работает, проверьте файл манифеста для свойства allowBackup, если вы обнаружите это свойство в файле манифеста, просто удалите его и удалите приложение, а затем установите приложение, оно будет работать. наверняка, а затем вы можете снова установить это свойство.
person
Abdul Waheed
schedule
21.01.2021