当前位置: 首页 > 知识库问答 >
问题:

屏幕关闭后如何运行位置跟踪服务?

赖鸿羲
2023-03-14

屏幕关闭时无法更新位置。

屏幕关闭后如何运行位置跟踪服务?

开启服务

val serviceClass = ControlLocationService::class.java
val intent = Intent(activity, serviceClass)
activity?.startService(intent)

在onLocationChanged方法中,我尝试Log. e(),但在屏幕关闭时不在logcat中显示纬度和经度

class ControlLocationService : Service() {

    lateinit var locationRequest: LocationRequest
    lateinit var fusedLocationProviderClient: FusedLocationProviderClient
    private lateinit var locationCallback:LocationCallback

    override fun onBind(intent: Intent): IBinder? {
        throw UnsupportedOperationException("Not yet implemented")
    }

    @SuppressLint("InvalidWakeLockTag")
    override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
        //service is started
        updateLocation()
        return START_STICKY
    }

    @SuppressLint("MissingPermission")
    private fun updateLocation() {
        locationCallback = object : LocationCallback() {
            override fun onLocationResult(locationResult: LocationResult?) {
                onLocationChanged(locationResult!!.lastLocation)
            }
        }
        buildLocationRequest()
        fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
        fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.myLooper())
    }

    private fun onLocationChanged(location: Location) {
        Log.e("...", location.latitude.toString()+location.longitude.toString())
    }

    private fun buildLocationRequest() {
        locationRequest = LocationRequest()
        locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
        locationRequest.interval = 3000
        locationRequest.fastestInterval = 1000
        //locationRequest.smallestDisplacement = 1f
    }


}

屏幕关闭时帮我介绍一下服务管理。谢谢你。

共有1个答案

狄冥夜
2023-03-14

你需要一个wakelock,我还会让你的服务成为前台。这将使android不太可能杀死你的应用程序或服务。实际上,根据后台位置限制,它并没有说你需要一个wakelock——只有前台服务。通过让你的应用程序在后台持续工作,你会让它很快耗尽你的用户电池——这很糟糕。考虑使用被动位置更新,这些可能会在一小时内发生——这可能不是你想要的。

您可能还想了解“打瞌睡”模式,该模式使所有未列入白名单的应用程序在屏幕关闭模式下忽略唤醒锁。

要添加唤醒锁:

val mgr = service.getSystemService(Context.POWER_SERVICE) as PowerManager
val wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "myAppName:MyWakeLock")
wakeLock.acquire()

onDestroy中:

wakeLock.release()

使用下面的代码将通知添加到通知栏并使服务成为前台。您应该在您的onStartCommand中添加addServiceNotify(this)

fun addServiceNotification(service: Service) {
    val mgr = NotificationManagerCompat.from(service)
    val title = "Caption"
    val text = "Location"

    if (Build.VERSION.SDK_INT >= 26) {
        val notificationManager = service.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        if (notificationManager != null) {
            var mChannel: NotificationChannel? = notificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID)
            if (mChannel == null) {
                mChannel = NotificationChannel(NOTIFICATION_CHANNEL_ID, "myAppName", NotificationManager.IMPORTANCE_LOW)
                notificationManager.createNotificationChannel(mChannel)
            }
        }

        val notification = NotificationCompat.Builder(service, NOTIFICATION_CHANNEL_ID)
                .setSmallIcon(R.drawable.app_icon)
                .setTicker(title)
                .setWhen(System.currentTimeMillis())
                .setContentTitle(title)
                .setContentText(text)
                .setOnlyAlertOnce(true)
                .setOngoing(true)
                .build()

        service.startForeground(LOCATION_NOTIFICATION_ID, notification)
        mgr.cancel(LOCATION_NOTIFICATION_ID)
        mgr.notify(LOCATION_NOTIFICATION_ID, notification)
    }
}

// remove notification for location service
fun removeServiceNotification(service: Service) {
  val notificationManager = service.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
  notificationManager?.cancel(LOCATION_NOTIFICATION_ID)
}

companion object {
    val LOCATION_NOTIFICATION_ID = 1001
    val NOTIFICATION_CHANNEL_ID = "myAppName"
}
 类似资料:
  • 在我的例子中,我不需要重写类名并且我发送空值...但我正在等待48小时,我的firebase analytics控制台没有显示关于这个事件的信息,有什么想法吗? 提前道谢!

  • 我目前正在编写一个应用程序,它依赖于位置跟踪,并将有关位置的数据发送到服务器。然而,问题是它必须24/7运行,目前我正在经历每2-3天发生一次的随机崩溃。为了让应用程序在后台持续运行,我在beginBackgroundTaskWithExpirationHandler方法的右边放置了一个NSTimer,它位于ApplicationIdentinterBackground方法的后面。计时器每分钟执行

  • 我看到最后一个android sdk中有一个更新,他们显示,他们记录了每个事件的参数,但是我如何添加屏幕跟踪? 仪表板中有一个用户参与度选项卡,但该选项卡不会展开以提供更多见解。 但是,我在切换活动时看到这样的消息: D/FA:记录事件(FE):_e,束[{_o=auto,_et=4807,_sc=MainActivity,_si=-3289793799694080660}] 这是什么意思?他们在

  • 问题内容: 如果对http请求的响应是带有cookie的重定向(http代码302), 您如何指示Go客户使用收到的Cookie跟踪新位置? 在CURL中,可以通过以下方式轻松设置客户端: 您如何在Go中做到这一点? 问题答案: 使用Go 1.1,您可以使用。 这是一个工作示例:

  • 关闭屏幕盖时   设定关闭屏幕盖时的动作。 标准 关闭屏幕盖时,显示专用的画面。 进入睡眠模式 让主机进入睡眠模式。 提示 若主机处于锁定状态(POWER(电源)/HOLD(固定)按钮滑至下方),即使已选择[进入睡眠模式],主机仍不会在关闭屏幕盖时进入睡眠模式。 屏幕盖关闭时显示的画面 在屏幕盖关闭时按下L/R按钮,即可变更显示的内容。 同时按下L/R按钮 每次同时按下L/R按钮,可交替显示月历/

  • 为了创建一个位置跟踪系统(基于fusedlocationprovider),该系统必须跟踪一个人在特定时间段内的位置。 在特定的时间间隔内,需要广播位置,即使应用程序关闭,也不应终止服务。 我应该使用前台还是后台服务,或者两者结合使用,再加上一个解释会很有帮助。