Intent服务无法在后台启动
Intent service can't be started in background
在我的 android 应用程序中,我想检测 activity 从 still 到 walking 的变化并开始跟踪位置,无论应用程序的状态如何(在后台或完全关闭)。
我能够通过将其设为前台服务(显示通知)来创建在应用程序在后台运行的位置跟踪服务,但我无法根据 activity 检测开始跟踪。
这是 IntentService
的代码片段,它应该在收到检测到 activity 转换的意图后启动位置跟踪服务:
class ActivityDetectionIntent : IntentService(TAG) {
override fun onHandleIntent(intent: Intent?) {
val i = Intent(this@ActivityDetectionIntent, LocationTracking::class.java)
if (Build.VERSION.SDK_INT >= 26) {
startForegroundService(i)
// this followed by foregroundService call in LocationTracking service
} else {
startService(i)
}
}
// ...
}
这是我收到的错误消息:
2019-12-04 19:57:59.797 3866-15015/? W/ActivityManager: Background start not
allowed: service Intent { cmp=com.anatoliymakesapps.myapplication/.ActivityDetectionIntent
(has extras) } to com.anatoliymakesapps.myapplication/.ActivityDetectionIntent
from pid=-1 uid=10377 pkg=com.anatoliymakesapps.myapplication startFg?=false
我想知道我是否遗漏了一些明显的东西,或者整个方法都是错误的,我需要尝试其他方法吗?任何能达到预期结果的建议都将受到赞赏。
我尝试将 IntentService
更改为 JobIntentService
但没有任何区别,错误看起来是一样的。
原来intent服务不能直接启动,但是借助broadcast receiver可以间接启动。
这是我用来代替IntentService
的:
class ActivityTransitionBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Log.i(TAG, "got activity transition signal")
val i = Intent(context, LocationTrackingService::class.java)
if (Build.VERSION.SDK_INT >= 26) {
startForegroundService(context, i)
} else {
context.startService(i)
}
}
companion object {
private val TAG = ActivityTransitionBroadcastReceiver::class.java.simpleName
}
}
清单:
<receiver android:name=".ActivityTransitionBroadcastReceiver" android:exported="true" />
在我的 android 应用程序中,我想检测 activity 从 still 到 walking 的变化并开始跟踪位置,无论应用程序的状态如何(在后台或完全关闭)。
我能够通过将其设为前台服务(显示通知)来创建在应用程序在后台运行的位置跟踪服务,但我无法根据 activity 检测开始跟踪。
这是 IntentService
的代码片段,它应该在收到检测到 activity 转换的意图后启动位置跟踪服务:
class ActivityDetectionIntent : IntentService(TAG) {
override fun onHandleIntent(intent: Intent?) {
val i = Intent(this@ActivityDetectionIntent, LocationTracking::class.java)
if (Build.VERSION.SDK_INT >= 26) {
startForegroundService(i)
// this followed by foregroundService call in LocationTracking service
} else {
startService(i)
}
}
// ...
}
这是我收到的错误消息:
2019-12-04 19:57:59.797 3866-15015/? W/ActivityManager: Background start not allowed: service Intent { cmp=com.anatoliymakesapps.myapplication/.ActivityDetectionIntent (has extras) } to com.anatoliymakesapps.myapplication/.ActivityDetectionIntent from pid=-1 uid=10377 pkg=com.anatoliymakesapps.myapplication startFg?=false
我想知道我是否遗漏了一些明显的东西,或者整个方法都是错误的,我需要尝试其他方法吗?任何能达到预期结果的建议都将受到赞赏。
我尝试将 IntentService
更改为 JobIntentService
但没有任何区别,错误看起来是一样的。
原来intent服务不能直接启动,但是借助broadcast receiver可以间接启动。
这是我用来代替IntentService
的:
class ActivityTransitionBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Log.i(TAG, "got activity transition signal")
val i = Intent(context, LocationTrackingService::class.java)
if (Build.VERSION.SDK_INT >= 26) {
startForegroundService(context, i)
} else {
context.startService(i)
}
}
companion object {
private val TAG = ActivityTransitionBroadcastReceiver::class.java.simpleName
}
}
清单:
<receiver android:name=".ActivityTransitionBroadcastReceiver" android:exported="true" />