2014-08-28 87 views
0

我正在从事这个项目,我需要位置更新和数据上传,即使主应用程序不在前台。我正在考虑将所有位置和网络功能放在一个服务中(XService,参数为参数),并在同一进程中使用广播(不能访问其他应用程序)在活动(主)和XService之间进行通信。LocationManager和网络服务

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


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

我的主要问题是 - 这是正确的方式吗?

另一个问题是:当XService将位置更新广播到Main,但Main停止(即未在前台运行)时会发生什么情况?我认为,由于Main处于停止状态,因此MainRedReceiver没有实例化,所以广播本质上什么都不做。这种未被广播的广播如何影响(或不是,视情况而定)XService或一般的过程/设备?

回答

0

这很有道理。我的建议是在主线程上启动服务,然后在Service类中形成新的线程。这将很好地包装服务,以便您不必生成一个线程来使用它,您可以调用它。

如果Main停止并且广播发送消息,则它是一个丢失的消息。您希望通过在OnStart中注册接收器并在OnStop上取消注册来避免这些情况。您可以保存活动可能需要在服务中知道的任何相关信息。

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

+0

回复:线程服务,而不是主要:好的建议,谢谢。它肯定会让线索更容易跟踪。 我假设你的意思是我应该注销接收器onStop(而不是onStart)。当活动启动时,它可以向服务部门要求提供所需的信息。 Messenger类看起来很有趣。我将不得不做更多的研究,以便更好地满足我的需求。 – LiveMynd 2014-08-28 04:46:33

+0

啊,是的,这就是我的意思。是的,这个信使类非常棒,我用它在这个应用程序中不断更新来自服务的位置数据的活动。您是否打算使用位置服务或locationClient等新位置apis(现在已弃用)? – 2014-08-28 05:06:32

+0

实际上,我的应用程序是互联网隐私研究的一部分,因此计算机参与者越少,分析数据就越容易。因此,我将使用简单的android.location库和类,因此我不必将Google Play服务(包含位置服务)纳入我的研究范围。 – LiveMynd 2014-08-28 06:48:31