在Android TabHost应用程序中完成活动间通信的最佳方式

Mat*_*ttC 6 java android ipc

这是交易:我有一个Android应用程序需要每X秒(当前60秒)调用一个Web服务.此应用程序有多个选项卡,这些选项卡都需要与数据本身进行交互.一个是MapView,一个是ListView,然后第三个是无关紧要的,但最终还需要得到一些全局数据.问题是我希望我的主要活动有一个在后台运行的线程,获取结果,然后指示TabHost中的两个子活动使用最新数据更新自己.此外,当用户单击选项卡并触发onCreate/onResume活动时,我还想通过从主活动获取最新数据来强制重绘.我真的很茫然.我已尝试使用服务和一些ghetto静态方法将活动的实例传递给服务,以便在定时器触发时调用特定函数来更新其视图,但减速非常糟糕且代码只是丑陋难看丑陋.有什么建议?

编辑:所以我在tabhost活动中将其实现为计时器驱动的线程,然后我在每个子活动中都有计时器驱动的线程,然后获取数据(以同步的方式)并更新它们的地图/列表.它的速度要快得多,但仍然感觉有点破解,尤其是我在父活动中调用自定义函数的部分,如下所示:

((MainActivity)getParent()).getNearbyMatches();
Run Code Online (Sandbox Code Playgroud)

这增加了一个强烈耦合的元素,我并不十分兴奋,但从性能的角度来看,它比它更好.我很欣赏已经给出的答案,并将对内容提供商进行一些研究,但我不确定是否要回到服务模型.

Mat*_*ttC 7

所以我找到了我认为的答案:应用程序类.您可以扩展此类以跟踪全局应用程序状态.

AndroidManifest.xml文件中,您可以在android:name属性中引用完全限定的自定义类,并在应用程序启动时进行实例化.

然后,任何Activity都可以调用"getApplication()",它将返回自定义Application类的实例,然后您可以根据需要进行调整.


Pra*_*ast 5

每次有新数据时,为什么要更新所有子活动?这对我来说听起来效率低下.仅更新当前可见的活动.

一种可行的方法是通过自定义内容提供商.让您的服务更新您的活动的数据源,并获取当前可见的活动以收听此内容的更改.所以基本上,你在调用OnResume时注册到内容提供者,并在调用OnPause时注销.

根据经验,从不存储Activity的静态引用!! 你最终会发现丑陋的泄漏.如果它是您的应用程序必须的,那么至少使用WeakReferences