【问题标题】:LocationManager and Networking in a Service服务中的 LocationManager 和网络
【发布时间】:2014-08-28 01:42:49
【问题描述】:

我正在处理这个项目,即使主应用程序不在前台,我也需要位置更新和数据上传。我正在考虑将所有位置和网络功能放在一个服务中(XService,为了论证),并使用同一进程中的广播在 Activity(主)和 XService 之间进行通信(其他应用程序无法访问)。

我还没有写代码,但是工作流程是这样的:


1. Main -- 开始。在onCreate中,启动一个新的Thread,然后就可以了 实例化和绑定 XService。
2. 主界面——登录界面。获取数据, 将其打包在 Intent 中并广播到 XService。
3. XService -- 接收广播,解包意图。设置套接字和数据流。设置 LocationManager 用于更新。向 Main 广播网络是 准备好。每次 LocationManager 更新时上传数据。
4. Main -- 收到网络就绪广播后,准备Intent进行初始化和广播。
5. XService -- 接收 初始化请求广播,解包,执行网络任务, 广播回应。
6. 根据用户重复令人作呕 互动和任何定时更新。
x.主要——注销时, 广播到 XService。
x+1。 XService -- 发送注销信息到 服务器,关闭套接字,向 Main 广播它正在退出 优雅地,然后 stopSelf()。
x+2 Main -- 完成注销 过程。

我的主要问题是——这是正确的做法吗?

另一个问题是:当 XService 向 Main 广播 Location 更新,但 Main 停止(即没有在前台运行)时会发生什么?我假设由于 Main 处于停止状态而未实例化 Main 上的 BroadcastReceiver,因此广播基本上什么都不做。这种未接收到的广播如何影响(或不影响,视情况而定)XService 或整个流程/设备?

【问题讨论】:

    标签: android networking android-intent service broadcast


    【解决方案1】:

    这是有道理的。我的建议是在主线程上启动服务,然后在 Service 类中形成新线程。这将很好地打包服务,这样您就不必生成线程来使用它,您只需调用它即可。

    如果 Main 停止并且广播发送消息,则它是丢失的消息。您想通过在 OnStart 注册接收器并在 OnStop 取消注册来避免这些情况。您可以将 Activity 可能需要知道的任何相关信息保存在 Service 本身中。

    广播接收器的替代方案是 Messenger 类。 (http://developer.android.com/reference/android/os/Messenger.html)

    【讨论】:

    • 回复:服务中的线程而不是主线程:很好的建议,谢谢。它肯定会使跟踪线程更容易。我假设您的意思是我应该取消注册接收器 onStop(而不是 onStart)。当活动启动时,它可以只向服务询问所需的信息。 Messenger 类看起来很有趣。我需要做更多的研究,看看它是否更符合我的需求。
    • 啊,是的,我就是这个意思。是的,Messenger 类非常棒,我将它用于这个应用程序,在该应用程序中,我不断使用来自服务的位置数据更新活动。您是否打算使用较新的位置 API,例如 locationServices 或 locationClient(现已弃用)?
    • 实际上,我的应用程序是互联网隐私研究的一部分,因此参与计算的参与方越少,我分析数据就越容易。因此,我将使用普通的 android.location 库和类,因此我不必将 Google Play 服务(包含定位服务)纳入我的学习范围。
    猜你喜欢
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多