【问题标题】:Location while in background Android Oreo在后台 Android Oreo 中的位置
【发布时间】:2019-11-21 16:58:13
【问题描述】:

我想构建一个像 Run Keeper 这样的应用程序,以便在外出时进行跟踪。例如,在手机锁定时跟踪用户位置的最佳方法是什么。用户将明确启动活动,并且可能会锁定和解锁手机以查看沿途的进度。这在 oreo 之前相对简单,但现在我的原始代码将不再起作用,并且应用程序会在几分钟后停止记录位置。

目前我正在注册一项服务。

startService(Intent(this, EWLocationService::class.java))

我正在通过通知调用服务中的前台:

startForeground(1, notification)

我通过广播将位置发送回主应用程序,应用程序可以将位置添加到地图并将其保存到 Room 数据库。

这在以前可以正常工作,但现在无法正常工作。我应该怎么做才能实现所需的功能?

【问题讨论】:

    标签: android location background-service


    【解决方案1】:

    对于奥利奥及以上你必须调用 ContextCompat.startForegroundService(this, serviceIntent);启动服务而不是 startService(serviceIntent)

    ContextCompat 中的源代码如下所示

    /**
     * startForegroundService() was introduced in O, just call startService
     * for before O.
     *
     * @param context Context to start Service from.
     * @param intent The description of the Service to start.
     *
     * @see Context#startForegroundService(Intent)
     * @see Context#startService(Intent)
     */
    public static void startForegroundService(@NonNull Context context, @NonNull Intent intent) {
        if (Build.VERSION.SDK_INT >= 26) {
            context.startForegroundService(intent);
        } else {
            // Pre-O behavior.
            context.startService(intent);
        }
    }
    

    并且在服务内部,您必须在服务启动后立即调用 startForeground(int id, Notification notification)

    【讨论】:

      【解决方案2】:

      你应该阅读奥利奥更新相关文件。

      默认情况下,这些更改仅影响面向 Android 8.0(API 级别 26)或更高版本的应用。但是,用户可以从“设置”屏幕为任何应用启用这些限制,即使应用的目标 API 级别低于 26。您可能需要更新应用以符合新的限制。

      查看您的应用如何使用服务。如果您的应用程序依赖于在您的应用程序空闲时在后台运行的服务,您将需要替换它们。可能的解决方案包括:

      如果您的应用需要在应用处于后台时创建前台服务,请使用 startForegroundService() 方法而不是 startService()。

      如果您想了解更多关于https://developer.android.com/about/versions/oreo/background的信息

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-01
        • 2018-08-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-21
        • 1970-01-01
        • 2019-03-03
        相关资源
        最近更新 更多