2011-12-20 84 views
0

我有一个Android应用程序,它依赖于web服务返回的值。该值每周只更改一次。客户应该检测到这个变化的值,但是他们发现这种变化的确切时间并不重要,12到24小时之后应该没问题。我应该安排在Android自定义应用程序类onCreate()方法中执行的操作吗?

我的当前实现在自定义Application类的onCreate()方法中启动一个IntentService,该方法从webservice中检索值。我还将最后一次检索的值保存在SharedPreferences中,因此应用程序不必等到检索到该值。

现在我的问题是,如果有必要在onCreate()方法中第一次检索后计划检索此值,比方说12小时后。我知道onCreate()方法在应用程序的生命周期中只调用一次,但我不知道Android系统会终止应用程序的可能性。假设应用程序将被终止足够多的时间以便不需要调度是否合理?如果我应该安排这次手术,那么最好的方法是什么?

+0

如果你使用onCreate,我不认为你会有任何保证,它会被称为第二次。例如。如果用户插入手机进行充电,则会关闭睡眠状态并让应用程序持续运行数日。非常不可能,但并非不可能。如果我是你,我会设置某种计划任务。也许这个链接将有所帮助 - http://developer.android.com/resources/articles/timed-ui-updates.html。 – 2011-12-20 13:07:52

+0

你提出的场景是我问这个问题的原因:)在链接的文章中,处理程序和postDelayed()方法的代码示例对我来说看起来不错,我认为它也是一个有效的解决方案? – 2011-12-20 13:22:14

+0

我将实施您的链接文章中概述的解决方案。如果你把它放在你自己的答案中,我会接受你的答案。如果不是,我会在稍后回答我自己的问题。 – 2011-12-20 14:08:52

回答

1

如果您使用的是onCreate(),我不认为您有任何担保,它将被称为第二次。例如。如果用户插入手机进行充电,则会关闭睡眠状态并让应用程序持续运行数日。非常不可能,但并非不可能。

如果我是你,我会设置某种计划任务。也许这个链接将帮助:

http://developer.android.com/resources/articles/timed-ui-updates.html

的示例使用OnClickListener取消任务。

OnClickListener mStopListener = new OnClickListener() { 
    public void onClick(View v) { 
     mHandler.removeCallbacks(mUpdateTimeTask); 
    } 
}; 

你可能想把它放在onDestroy()的其他地方。

+0

我实现了这一点,就像一个魅力。我在我的Application类的onTerminate()方法中调用了handler.removeCallbacks()。但我不认为这是必要的,因为我的理解是,在应用程序终止的情况下,应用程序的主线程也会关闭,并且此线程消息队列中的所有发布消息也将被删除。 – 2011-12-20 14:35:28

+0

嗯,不知道有关发布的消息。如果可能,我会明确地删除它们。此外,'Application.onTerminate()'不保证运行 - *它永远不会在生产Android设备上调用* - http://developer.android.com/reference/android/app/Application.html#onTerminate% 28%29。 – 2011-12-20 14:42:24

+0

关于onTerminate()的好处,我不知道。至于删除消息:根据http://developer.android.com/reference/android/os/Handler.html#postDelayed%28java.lang.Runnable,如果活套终止,则放弃%20long%29消息,这如果一个进程被杀死的话会发生 – 2011-12-20 14:58:28

0

有几个选择,因为我有类似的设计挑战。两者都有优点和缺点。

选项A

你可以有一个闪屏,像许多应用程序,并使用asyncTask类Web请求和更新您的共享偏好。您可以设置自定义超时时间,以便应用程序不会在启动屏幕上停留太久。不管结果如何,如果更新或者没有更新,您都可以加载sharedPreferences中的内容,并将其用于该运行中的应用程序使用情况。

关于这一点的好处是,每次应用程序启动时,您不必担心数据是否为最新版本,因为您只需去获取它。对于性能更新,您还可以存储上次更新sharedPref值(例如,您获得的值小于12小时前),因此可以跳过Web请求 - 结果使您的启动画面可以快速前后移动。

选项B

您可以使用通过AlarmManager报警,这会比这将是一个不必要的电池漏极的服务要好得多。甚至有一天的“INTERVAL_DAY”时间间隔的枚举。当警报被触发时,广播接收器将执行您的自定义代码,以使网络请求获得值并存储它们。您可以说明“重复报警”是否为单次使用。

希望有所帮助。

编辑:有没有唯一的选择只是我选择的相关性。

+0

我不想使用启动画面,因为我的应用程序只显示运动结果,因此如果不需要,我的用户不想等待。此外,选项A并不处理保罗格里姆在他对我的问题的评论中概述的情况。选项B是处理我的问题的好方法,但我认为这对我的需求来说过于复杂。但是,无论如何感谢您的意见。 – 2011-12-20 14:07:41

相关问题