Android 暂停服务时从服务更新活动数据

Android 暂停服务时从服务更新活动数据,android,android-sqlite,android-contentprovider,android-lifecycle,Android,Android Sqlite,Android Contentprovider,Android Lifecycle,假设我有一个具有数据对象的活动。它基于该对象更新其gui组件。现在让我们假设它已暂停(调用OnPause),但未停止或销毁 同时,接收到推送通知(intentservice启动),我需要使用推送通知对象更新该对象,以便在应用程序恢复时更新I gui 我曾想过向活动发送广播,以便它可以更新其数据对象,但我在某个地方读到,当活动暂停时,则不会接收广播 在这种情况下我该怎么办?您几乎将其视为活动已被破坏。您不能真的假设一旦调用onPause它就不会发生 如果对象表示持久性的东西,那么只需更新对象的持久

假设我有一个具有数据对象的活动。它基于该对象更新其gui组件。现在让我们假设它已暂停(调用OnPause),但未停止或销毁

同时,接收到推送通知(intentservice启动),我需要使用推送通知对象更新该对象,以便在应用程序恢复时更新I gui

我曾想过向活动发送广播,以便它可以更新其数据对象,但我在某个地方读到,当活动暂停时,则不会接收广播


在这种情况下我该怎么办?

您几乎将其视为活动已被破坏。您不能真的假设一旦调用onPause它就不会发生

如果对象表示持久性的东西,那么只需更新对象的持久性部分,并在活动恢复时检索它。例如,如果它表示服务的状态,则绑定到该服务并进行更新。如果是数据库,则更新数据库,然后在恢复时刷新活动


如果它是一个临时对象,只在活动的整个生命周期内有效,那么您需要做一些持久化的东西,以便活动在恢复时可以检查。一些简单的东西,比如“sharepreferences”中的布尔变量。在onResume中,检查对象(如果存在),然后检索对象,然后清除对象。

活动开始时,您应该绑定到
服务。然后在
onResume
中,您可以请求活动暂停时可能发生的更新

您可以考虑通过回调将数据传递给活动,以便在暂停时更新活动中的变量,但是您需要在<代码>中更新UI。

也考虑到当你的<代码>活动<代码>暂停时,它可能被破坏并重新创建。基于你的问题,你似乎不关心这个场景,但我认为解释它很重要。要处理此场景的任何更改,您需要为更改保留数据。如果要持久化数据,则不需要绑定到

服务
,只需在
onResume
中检查持久化数据存储即可

编辑:

在您的评论中,您提到了一个您无法“绑定”的
IntentService
。在这种情况下,您有几个选项(基本上按优先顺序列出)。首先,您可以在创建活动时创建
服务
,然后让
IntentService
将意图转发到该服务。其次,您可以在
活动
中使用
静态
变量,以允许
IntentService
访问共享数据存储。如前所述,您还可以将数据(放入
SharedReferences
、文件或数据库中)持久化。最后,您可以使用
应用程序
类存储对数据的引用,以便在应用程序处于活动状态时传递数据

我想向活动发送一个广播,以便它可以更新 它是dataobject,但我在某个地方读到,当活动暂停时 没有收到广播

在这种情况下我该怎么办


我认为该信息的来源是不正确的,如果您在
onCreate
中声明一个接收者,并在
onDestroy
中删除它,您就不会有任何问题。我的意思是,首先用您的服务解析推送通知,然后将
localBroadcast
发送到活动。这与您所想的一样简单。然后更新y我们的GUI在
onreceive
方法中为您的
receiver

实现这一点的困难但正确的方法是为您的应用程序构建您自己的自定义
ContentProvider
,并更新从web服务接收的所有数据,并将通知推送到该
ContentProvider
。当
活动返回foregr时此外,它使用
ContentProvider
提供的新数据进行自我更新

这很难,因为定制
内容提供商
需要大量工作。这是正确的方法,因为它符合移动应用程序的行为和Android架构:比如用户激活一个web服务或一些计算密集型任务,然后关闭应用程序;或者说推送通知到达并返回需要更新和显示应用程序的数据。在这两种情况下,应用程序的
活动可能不再位于前台,但可以使用
服务
执行一些非UI操作。现在在该操作结束时,
服务
通过
内容提供程序
对数据进行更改,并且当e用户再次激活该应用程序,
活动从
内容提供商
获取新数据

引述:

内容提供程序是一个标准接口,它将数据连接到一个数据库中 代码在另一个进程中运行的进程

作为开发人员,您应该始终假设用户可以随时调用应用程序,并随时将其关闭。无论
活动
是否在前台,都需要正确更新和维护应用程序的数据


谷歌自己的应用程序使用自定义的
ContentProvider
s.
Gmail
应用程序特别利用其
ContentProvider
在网络连接可用时获取新电子邮件并离线显示电子邮件。
Facebook
WhatsApp
&
Twitter
安卓应用程序也使用
Content提供商
s.

感谢您提供了正确的行为。如果您也能为我提供一个教程,我将不胜感激。在我看来,ContentProvider喜欢共享首选项,您可以根据自己的喜好从服务或活动中调用它description@Snake:没有比…更合适的开始了。顺便说一句,请参见编辑后的答案。OP还应注意