暂停时从服务更新 Activity 数据
Update Activity data from service when its paused
假设我有一个包含数据对象的 activity。它根据该对象更新其 gui 组件。现在假设它已暂停(调用 OnPause)但未停止或已销毁
同时,收到推送通知(intentservice 已启动),我需要使用推送通知对象更新该对象,以便在恢复应用程序时更新 gui。
我考虑过向 activity 发送广播,以便它可以更新其数据对象,但我在某处读到,当 activity 暂停时,将收不到广播。
遇到这种情况怎么办?
你几乎把它当作 Activity 被摧毁了。您不能真的假设它 不会 一旦调用 onPause 就会发生。
如果对象表示持久的东西,则只需更新对象的持久部分并在 Activity 恢复时检索它。例如,如果它表示服务的状态,则绑定到服务并更新。如果是数据库,则更新数据库然后刷新 Activity onResume。
如果它是一个仅在 Activity 的生命周期内有效的临时对象,那么您需要做一些持久化的事情,以便 Activity 可以在恢复时进行检查。一些简单的东西,比如 "sharepreferences" 中的布尔变量。在 onResume 中,检查对象,如果存在,则检索对象,然后清除对象。
您应该在 Activity
启动时绑定到 Service
。然后在 onResume
中,您可以请求在 activity 暂停时可能发生的更新。
您可以考虑通过回调将数据传递给 activity,以在暂停时更新 activity 中的变量,但随后您将需要更新 UI 中的 onResume
.
还要考虑到当您的 Activity
暂停时,它可能会被销毁并重新创建。根据您的问题,您似乎并不关心这种情况,但我认为解释它很重要。要处理此场景的任何更改,您需要保留更改的数据。如果您正在持久化数据,那么您不需要绑定到 Service
,您只需要检查 onResume
中的持久化数据存储。
编辑:
在您的评论中,您提到了一个您不能 "bind" 的 IntentService
。在这种情况下,您有多种选择(基本上按优先顺序列出)。首先,您可以在创建 activity 时创建一个 Service
,然后将 IntentService
转发到该服务。其次,您可以在 Activity
中设置一个 Static
变量,以允许 IntentService
访问共享数据存储。如前所述,您还可以持久化数据(放入 SharedPreferences
、文件或数据库。最后,您可以使用 Application
class 来存储对数据的引用,以便在您的应用程序处于活动状态,您可以传递数据。
I thought about sending a broadcast to the activity so it can update
its dataobject But I read somewhere that when activity is paused then
broadcasts are not received.
What should I do in this case?
我认为该信息的资源不正确,如果您在 onCreate
中声明接收器并在 onDestroy
中删除它,您将不会有任何问题。我的意思是,首先使用您的服务解析推送通知,然后将 localBroadcast
发送到 activity。它和你想的一样简单。然后在 reciever
.
的 onRecieve
方法中更新您的 GUI
执行此操作的困难但正确的方法是为您的应用构建您自己的自定义 ContentProvider
并更新从 Web 服务接收的所有数据并将通知推送到此 ContentProvider
。当 Activity
返回前台时,它会使用 ContentProvider
.
提供的新数据进行自我更新
困难,因为定制 ContentProvider
需要大量工作。这是 正确的 方式,因为它符合移动应用程序的行为和 Android 体系结构:假设用户激活网络服务或某些计算密集型任务,然后关闭该应用程序;或者说推送通知到达并要求更新和显示应用程序的数据。在这两种情况下,应用程序的 Activity
可能不再位于前台,但 Service
可用于执行一些非 UI 操作。现在,在该操作结束时,Service
通过 ContentProvider
对数据进行更改,当用户再次激活应用程序时,Activity
会从 ContentProvider
.
Content providers are the standard interface that connects data in one
process with code running in another process.
作为开发人员,您应该始终假设用户可以随时调用应用程序并随时关闭它。无论Activity
是否在前台,应用程序的数据都需要正确更新和维护。
Google 自己的应用程序使用自定义 ContentProvider
。 Gmail
应用程序特别利用其 ContentProvider
在网络连接可用时接收新电子邮件并离线显示电子邮件。 Facebook
、WhatsApp
和 Twitter
Android 应用程序也使用了 ContentProvider
s。
假设我有一个包含数据对象的 activity。它根据该对象更新其 gui 组件。现在假设它已暂停(调用 OnPause)但未停止或已销毁
同时,收到推送通知(intentservice 已启动),我需要使用推送通知对象更新该对象,以便在恢复应用程序时更新 gui。
我考虑过向 activity 发送广播,以便它可以更新其数据对象,但我在某处读到,当 activity 暂停时,将收不到广播。
遇到这种情况怎么办?
你几乎把它当作 Activity 被摧毁了。您不能真的假设它 不会 一旦调用 onPause 就会发生。
如果对象表示持久的东西,则只需更新对象的持久部分并在 Activity 恢复时检索它。例如,如果它表示服务的状态,则绑定到服务并更新。如果是数据库,则更新数据库然后刷新 Activity onResume。
如果它是一个仅在 Activity 的生命周期内有效的临时对象,那么您需要做一些持久化的事情,以便 Activity 可以在恢复时进行检查。一些简单的东西,比如 "sharepreferences" 中的布尔变量。在 onResume 中,检查对象,如果存在,则检索对象,然后清除对象。
您应该在 Activity
启动时绑定到 Service
。然后在 onResume
中,您可以请求在 activity 暂停时可能发生的更新。
您可以考虑通过回调将数据传递给 activity,以在暂停时更新 activity 中的变量,但随后您将需要更新 UI 中的 onResume
.
还要考虑到当您的 Activity
暂停时,它可能会被销毁并重新创建。根据您的问题,您似乎并不关心这种情况,但我认为解释它很重要。要处理此场景的任何更改,您需要保留更改的数据。如果您正在持久化数据,那么您不需要绑定到 Service
,您只需要检查 onResume
中的持久化数据存储。
编辑:
在您的评论中,您提到了一个您不能 "bind" 的 IntentService
。在这种情况下,您有多种选择(基本上按优先顺序列出)。首先,您可以在创建 activity 时创建一个 Service
,然后将 IntentService
转发到该服务。其次,您可以在 Activity
中设置一个 Static
变量,以允许 IntentService
访问共享数据存储。如前所述,您还可以持久化数据(放入 SharedPreferences
、文件或数据库。最后,您可以使用 Application
class 来存储对数据的引用,以便在您的应用程序处于活动状态,您可以传递数据。
I thought about sending a broadcast to the activity so it can update its dataobject But I read somewhere that when activity is paused then broadcasts are not received.
What should I do in this case?
我认为该信息的资源不正确,如果您在 onCreate
中声明接收器并在 onDestroy
中删除它,您将不会有任何问题。我的意思是,首先使用您的服务解析推送通知,然后将 localBroadcast
发送到 activity。它和你想的一样简单。然后在 reciever
.
onRecieve
方法中更新您的 GUI
执行此操作的困难但正确的方法是为您的应用构建您自己的自定义 ContentProvider
并更新从 Web 服务接收的所有数据并将通知推送到此 ContentProvider
。当 Activity
返回前台时,它会使用 ContentProvider
.
困难,因为定制 ContentProvider
需要大量工作。这是 正确的 方式,因为它符合移动应用程序的行为和 Android 体系结构:假设用户激活网络服务或某些计算密集型任务,然后关闭该应用程序;或者说推送通知到达并要求更新和显示应用程序的数据。在这两种情况下,应用程序的 Activity
可能不再位于前台,但 Service
可用于执行一些非 UI 操作。现在,在该操作结束时,Service
通过 ContentProvider
对数据进行更改,当用户再次激活应用程序时,Activity
会从 ContentProvider
.
Content providers are the standard interface that connects data in one process with code running in another process.
作为开发人员,您应该始终假设用户可以随时调用应用程序并随时关闭它。无论Activity
是否在前台,应用程序的数据都需要正确更新和维护。
Google 自己的应用程序使用自定义 ContentProvider
。 Gmail
应用程序特别利用其 ContentProvider
在网络连接可用时接收新电子邮件并离线显示电子邮件。 Facebook
、WhatsApp
和 Twitter
Android 应用程序也使用了 ContentProvider
s。