假设我有一个有数据对象的活动。它根据该对象更新其gui组件。现在让我们说它被暂停(OnPause被调用)但没有停止或被摧毁
同时,收到推送通知(启动了intentservice),我需要使用推送通知对象更新该对象,以便在恢复应用程序时更新gui。
我考虑过向活动发送一个广播,以便它可以更新其数据对象但我在某处读到,当活动暂停时,则不会收到广播。
在这种情况下我该怎么做?
答案 0 :(得分:6)
执行此操作的难以正确的方法是为您的应用构建自己的自定义ContentProvider
,并更新从Web服务收到的所有数据并将通知推送到此ContentProvider
。当Activity
返回到前台时,它会使用ContentProvider
提供的新数据更新自己。
hard ,因为制作自定义ContentProvider
需要做很多工作。这是正确的方式,因为它符合移动应用程序和Android架构的行为:比如用户激活网络服务或一些计算密集型任务,然后解散应用程序;或者说推送通知到达并要求更新和显示应用程序的数据。在这两种情况下,应用程序的Activity
可能不再位于前台,但Service
可用于执行某些非UI操作。现在,在该操作结束时,Service
通过ContentProvider
对数据进行了更改,当用户再次激活应用时,Activity
将从ContentProvider
获取新数据{1}}。
内容提供程序是将数据连接在一起的标准接口 代码在另一个进程中运行的进程。
作为开发人员,您应该始终假设用户可以随时调用应用程序并随时将其关闭。无论Activity
是否在前台,应用程序的数据都需要正确更新和维护。
Google自己的应用使用自定义ContentProvider
。 Gmail
应用程序特别利用其ContentProvider
在网络连接可用时收到新电子邮件并离线显示电子邮件。 Facebook
,WhatsApp
& Twitter
Android应用也会使用ContentProvider
s。
答案 1 :(得分:1)
你几乎把它视为活动被销毁了。
时,你无法真正假设一旦onPause被发生。如果对象表示持久性的东西,则只需更新对象的持久部分,并在Activity恢复时检索它。例如,如果它表示服务的状态,则绑定到服务并进行更新。如果它是数据库,则更新数据库,然后刷新Activity onResume。
如果它是一个临时对象,它只在Activity的生命周期内有效,那么你需要创建一些持久性的东西,Activity可以在它恢复时检查。像“sharepreferences”中的布尔变量一样简单。在onResume中,检查对象是否存在,然后检索对象,然后清除对象。
答案 2 :(得分:1)
Service
启动时,您应该绑定到Activity
。然后在onResume
中,您可以请求在活动暂停时可能发生的更新。
您可以考虑通过回调将数据传递给活动,以便在活动暂停时更新活动中的变量,但是您需要更新onResume
中的用户界面。
还要考虑当您的Activity
暂停时,它可能会被销毁并重新创建。根据您的问题,您似乎并不关心这种情况,但我认为解释它很重要。要处理此方案的任何更改,您需要保留数据以进行更改。如果您要保留数据,那么您不需要绑定到Service
,只需要检查onResume
中的持久数据存储。
编辑:
在你的评论中,你提到了IntentService
你不能"绑定"至。在这种情况下,您有几个选项(基本按优先顺序列出)。首先,您可以在创建活动时创建Service
,然后对该服务进行IntentService
转发意图。其次,您可以在Static
中添加Activity
变量,以允许IntentService
访问共享数据存储。如前所述,您还可以保留数据(放入SharedPreferences
,文件或数据库。最后,您可以使用Application
类来存储对数据的引用,以便在您的应用处于活动状态时,你可以传递数据。
答案 3 :(得分:1)
我考虑过向活动发送广播,以便更新 它的数据对象但我在某处读到了当活动暂停时 没有收到广播。
在这种情况下我该怎么做?
我认为该信息的资源不正确,如果您在onCreate
中声明了一个接收器并在onDestroy
将其删除,那么您将不会遇到任何问题。我的意思是,首先使用您的服务解析推送通知,然后将localBroadcast
发送到活动。它就像你想象的一样简单。然后使用onRecieve
的{{1}}方法更新GUI。