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