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分钟更新一次)中保留最新数据。另外,我做这个应用程序的方法有问题吗?
提前谢谢你,抱歉我的英语不好,我尽力解释我的情况!
答案 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,那就太好了。