不使用唤醒锁,每30分钟运行一次服务

时间:2014-01-28 15:46:24

标签: java android json

  

tl; dr:我的应用不会使用服务器的最后一个值更新SharedPreferences,因为有时手机正在睡眠状态。

说明:

我是这个Android世界的新手,我一直在研究我的第一个“真正的”应用程序,但我有一些问题正确知道......

以下是我需要我的应用程序的工作方式:

  
      
  • 每30分钟检查一次新数据(数据是从我服务器上的json文件中提取的)
  •   
  • 如果数据与手机上存储的数据不同,则存储新数据并向用户发送通知。 (我正在使用 SharedPreferences 作为“存储”)
  •   

以下是我过去尝试实现的目标:

  
      
  • MainActivity.java / 活动(我的主要活动,duh')

  •   
  • cargarJson.java / AsyncTask (一个拉取json数据并返回jsonobject的类)。 Cargar =负荷(西班牙语)

  •   
  • DolarService.java / IntentService (该服务创建一个loadJson对象并执行它,然后发送通知)。

  •   
  • AlarmReceiver.java / BroadcastReceiver (这是一个AlarmManager执行 DolarService 的接收器每30分钟一次,每次手机启动时以及用户第一次运行应用程序时都会运行。

  •   

我设法做到了,但问题是我不想使用唤醒锁,因为它会快速耗尽电池。

我的AlarmManager不使用唤醒锁,因此当它每30分钟发送一次通知时,它会包含当手机“清醒”时存储在SharedPreferences中的最后一个值,而不是来自服务器的新数据。

这是我的来源: https://gist.github.com/anonymous/d5cccf5ba331f041630e

我的问题:如何在不使用唤醒锁的情况下,在SharedPreferences(每30分钟更新一次)中保留最新数据。另外,我做这个应用程序的方法有问题吗?

提前谢谢你,抱歉我的英语不好,我尽力解释我的情况!

2 个答案:

答案 0 :(得分:1)

看起来你没有使用唤醒锁。但是,您可以通过从清单中删除<uses-permission android:name="android.permission.WAKE_LOCK" />来确保这一点,然后您将确定您的应用程序没有获取唤醒锁,因为它没有权限。

编辑:

您错误地使用了IntentService。请参阅有关如何实施IntentService的文档。 IntentService已经创建了自己的工作线程,类似于AsyncTask,因此在您的情况下,在意图服务中执行AsyncTask是不必要的。相反,您应该提取AsyncTask中的所有内容,并在IntentService的{​​{1}}中实施,而不是onHandleIntent()onCreate()方法。

另一种选择是使用普通onDestroy(),并在Service方法中停止。

此外,这有点偏离主题,但在将上下文传递给另一个对象时,您应该使用AsyncTask's onPostExecute()

WeakReference<T>

答案 1 :(得分:0)

一切都很好。但是,如果您使用后台服务进行服务器操作并通过AlarmManager启动此服务,然后每30分钟启动一次PendingIntent,那就太好了。