phone 入睡时服务中断
Service interrupted when the phone falls asleep
在我的应用程序中,我启动了一个包含文件观察器的服务来监视目录。我的问题是,一段时间后服务中断,如果您唤醒 phone 服务会再次启动。我还尝试将观察者文件挂接到服务内的静态变量,但它仍然不起作用。谁能给我一个在 phone 启动时启动并且在 phone 入睡时不中断的服务中执行的 fileobserver 的示例?
服务从未打算永远运行,这种行为很可能是由打瞌睡模式引起的,如果您运行处于API 26 级或更高级别,则stricter restrictions 用于 后台服务 。
您可以 运行 一个 前台服务 (需要永久通知以告知用户您的应用正在 运行ning),但即使是前台服务当系统决定这样做时不被杀死是不安全的。
对于您的用例,您可以查看 Work Manager from the Jetpack Components. It offers a method to schedule a Job when a content URI changes: addContentUriTrigger()
示例代码:
// first define a worker - this will get called by the WorkManager and
// performs the code you put in doWork()
class YourWorker(context : Context, params : WorkerParameters)
: Worker(context, params) {
override fun doWork(): Result {
//your code
}
}
// add your content uri as a constraint trigger
val constraints = Constraints.Builder()
.addTriggerContentUri(YOUR_CONTENT_URI)
.build()
// create a request for the WorkManager
var req : OneTimeWorkRequest = OneTimeWorkRequestBuilder<YourWorker>()
.setConstraints(constraints)
.build()
// push your request to the WorkManager
WorkManager.getInstance().enqueue(req)
来自 Google 的官方 Codelab 是更好地理解这些概念的好方法:Background Work with WorkManager
在我的应用程序中,我启动了一个包含文件观察器的服务来监视目录。我的问题是,一段时间后服务中断,如果您唤醒 phone 服务会再次启动。我还尝试将观察者文件挂接到服务内的静态变量,但它仍然不起作用。谁能给我一个在 phone 启动时启动并且在 phone 入睡时不中断的服务中执行的 fileobserver 的示例?
服务从未打算永远运行,这种行为很可能是由打瞌睡模式引起的,如果您运行处于API 26 级或更高级别,则stricter restrictions 用于 后台服务 。
您可以 运行 一个 前台服务 (需要永久通知以告知用户您的应用正在 运行ning),但即使是前台服务当系统决定这样做时不被杀死是不安全的。
对于您的用例,您可以查看 Work Manager from the Jetpack Components. It offers a method to schedule a Job when a content URI changes: addContentUriTrigger()
示例代码:
// first define a worker - this will get called by the WorkManager and
// performs the code you put in doWork()
class YourWorker(context : Context, params : WorkerParameters)
: Worker(context, params) {
override fun doWork(): Result {
//your code
}
}
// add your content uri as a constraint trigger
val constraints = Constraints.Builder()
.addTriggerContentUri(YOUR_CONTENT_URI)
.build()
// create a request for the WorkManager
var req : OneTimeWorkRequest = OneTimeWorkRequestBuilder<YourWorker>()
.setConstraints(constraints)
.build()
// push your request to the WorkManager
WorkManager.getInstance().enqueue(req)
来自 Google 的官方 Codelab 是更好地理解这些概念的好方法:Background Work with WorkManager