【问题标题】:Android Services and ActivitiesAndroid 服务和活动
【发布时间】:2010-08-25 20:26:53
【问题描述】:

我对 Android 服务和活动生命周期有一些疑问。希望你们能帮帮我。我编写了一个使用 GPS 位置并存储它们的应用程序。它必须不断监控 GPS 位置更新才能正常工作。

现在,一切尽在一项活动中。因此,当您关闭活动时,您会丢失所有内容并且无法继续监控位置更新。这就是为什么我想为监控部分做一个后台服务。而且我一直在阅读Android Developer Guide和Reference,但仍然无法完全理解activity-service-process-lifecycle的东西。

考虑一下:您启动应用程序。它获得了 GPS 定位,现在您可以开始监控位置更新并保存它们。当你这样做时,它应该启动一个接收 GPS 位置更新的服务。所以现在你有一个活动和一个在同一个进程中运行的服务。行。但是,如果您按下手机上的硬件后退按钮会发生什么?是否只会在进程仍在运行您的服务的情况下终止活动?或者它会杀死活动和服务,从而杀死进程?是否有某种方法可以确保在活动被终止后服务继续在同一进程中运行?但是一种方法不像远程进程的整个辅助程序那么复杂?

在新进程中创建服务对我来说似乎没有必要,因为没有其他应用程序应该使用我的服务,我只需要监视部分在(GUI)活动停止时继续运行。我想在开发者网站上制作类似本地服务示例的东西,但我必须确保在活动被终止后服务继续运行。

【问题讨论】:

    标签: android process service android-activity gps


    【解决方案1】:

    当用户点击back 按钮时,与系统结束运行应用程序的进程时不同。当前的activityfinish(),但进程仍然存在。只要内存允许,无论 Activity 是否可见,Android 都会让服务保持活动状态。

    来自文档

    如果服务已经启动, 然后考虑它的托管过程 比任何人都不重要 当前可见的进程 屏幕上的用户,但更多 比任何过程都重要 可见的。因为只有几个进程 通常对用户可见, 这意味着该服务不应该 被杀死,除非内存极低 条件。

    服务不应该永远留在内存中,这是不好的做法,并不是你想要的。我建议使用IntentService 耦合通过LocationListenerLocationManager link to docs 接收位置更新

    public void requestLocationUpdates (String provider, long minTime, float minDistance, PendingIntent intent)
    

    此设置应该很好地为您服务,因为在每次更新时您都可以触发一个 Intent,它可以由您的 Service 处理,如果它不存在,它将被创建。

    【讨论】:

    • 感谢您澄清活动终止的事情。我读过关于 android 的内存管理技术。有一个基于它们托管的进程等的层次结构。您提出的解决方案,对我的服务有触发意图,如果它没有运行,可以重新启动它不是一个真正的选择。我的服务应该一直运行,直到到达某个 GPS 位置或用户通过 GUI 关闭整个东西。该服务的任务是监视进入的位置并对其进行分析,因此在完成之前不应终止它。否则就没用了。
    • 我看不出你不能用我描述的方法做到这一点。情况如下。您的 Activity 向 LocationManger 注册了一个 LocationListener 并使用 requestLocationUpdates 计划在每次位置更新时向您的服务发送一个 Intent。当您的服务收到该意图时,它可以将其与此“特定位置”进行比较,并在到达时执行一些操作。
    • 我看不出我为什么要这样做。如果我理解正确,与 Intent 一起使用的 requestLocationUpdates(...) 将能够重新启动服务?但是如果服务在运行过程中被杀死,我不需要重新启动它,这对程序没用。那么为什么不在服务中使用带有 LocationListener 的普通 requestLocationUpdates(...) 呢?我的意思是,在我的情况下,不需要服务重启功能,因为一旦它死了并且数据没有保存,程序就失败了。同样,您只需重启应用即可。
    • requestLocationUpdatesPendingIntent 一起使用时,基本上会在LocationListener 更新后向您的服务发送一条包含当前位置的消息。您以后可能需要的任何信息都可以存储在磁盘上。如果您不想自动重启,那么只需使用Service。我刚刚推荐了IntentService,因为我相信它更适合您的需求。
    • 谢谢。我已经使用带有 LocationListener 的 requestLocationUpdates 和前台的服务来实现它,如果服务在前台运行,它不会被尽快销毁。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    相关资源
    最近更新 更多