暂停时更新服务中的活动数据

时间:2015-02-28 18:36:05

标签: android android-sqlite android-contentprovider android-lifecycle

假设我有一个有数据对象的活动。它根据该对象更新其gui组件。现在让我们说它被暂停(OnPause被调用)但没有停止或被摧毁

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

我考虑过向活动发送一个广播,以便它可以更新其数据对象但我在某处读到,当活动暂停时,则不会收到广播。

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

4 个答案:

答案 0 :(得分:6)

执行此操作的难以正确的方法是为您的应用构建自己的自定义ContentProvider,并更新从Web服务收到的所有数据并将通知推送到此ContentProvider。当Activity返回到前台时,它会使用ContentProvider提供的新数据更新自己。

hard ,因为制作自定义ContentProvider需要做很多工作。这是正确的方式,因为它符合移动应用程序和Android架构的行为:比如用户激活网络服务或一些计算密集型任务,然后解散应用程序;或者说推送通知到达并要求更新和显示应用程序的数据。在这两种情况下,应用程序的Activity可能不再位于前台,但Service可用于执行某些非UI操作。现在,在该操作结束时,Service通过ContentProvider对数据进行了更改,当用户再次激活应用时,Activity将从ContentProvider获取新数据{1}}。

引用official tutorial

  

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

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

Google自己的应用使用自定义ContentProviderGmail应用程序特别利用其ContentProvider在网络连接可用时收到新电子邮件并离线显示电子邮件。 FacebookWhatsApp& 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。