意向服务无法在后台启动

时间:2019-12-04 20:03:57

标签: android geolocation android-pendingintent background-service activity-transition

在我的Android应用中,我想检测活动从静止变为步行,并开始跟踪位置,而不管应用的状态如何(在后台或完全关闭)。

我能够通过将其设置为前台服务(显示通知)来创建可在后台运行的位置跟踪服务,但是我无法基于活动检测开始跟踪。

这是IntentService的代码片段,应该在收到检测到活动转移的意图后启动位置跟踪服务:

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:后台启动不   允许:服务意图{cmp = com.anatoliymakesapps.myapplication / .ActivityDetectionIntent    (有其他功能)}到com.anatoliymakesapps.myapplication / .ActivityDetectionIntent   来自pid = -1 uid = 10377 pkg = com.anatoliymakesapps.myapplication startFg?= false

我想知道我是否错过了显而易见的事情,或者这整个方法是错误的,我需要尝试其他事情吗?任何可以达到预期效果的建议都会受到赞赏。

我尝试将IntentService更改为JobIntentService,但这没什么区别,错误看起来一样。

1 个答案:

答案 0 :(得分:0)

结果表明,意图服务不能直接启动,但是可以借助广播接收器间接实现。

这是我用来代替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" />