活动、异步任务和服务之间的数据交换
Data exchange between Activities, Asynctasks and Services
关于下面所述的问题,我已经到了需要决定是否要这样做的地步:
- 启动一次服务,其中有一个 AlarmManager,然后每 10 分钟启动一次查询。仅当用户将 "Onn-Off" 开关设置为 "Off" 时,该服务才会停止。
- 使用 AlarmManager 每 10 分钟启动一次 IntentService。此服务将仅在需要时启动,然后关闭
以下哪种方式更好:
- 能够与其他 activities/services 交换服务(或 Intenservice)接收到的数据
- 电池使用
- 总体 "good coding habits" ?
谢谢!
原问题:
我是一名新手 Android 开发人员,遇到过我不知道如何解决的情况。我已经花了几天时间寻找解决方案,但找不到。
在尝试开发我的第一个应用创意时,我开始尝试从互联网接收和解析数据。到目前为止,我所取得的成就是生成一个查询,该查询通过 API 接收 JSON 数据并解析此 JSON。所有这些都在 AsyncTask 中完成。然后在屏幕上显示接收到的数据。
但是,出于我的应用创意的目的,我需要在后台完成此操作。我想到的是:
- 启动一个与我的 Asynctask 几乎具有相同逻辑的服务。该服务由 AlarmManager 管理,然后在特定时间间隔内请求、接收和解析数据。
现在棘手的部分开始了:
我收到的数据(假设每 10 分钟一次)将用于更改闹钟。因此,作为一个简单的示例,假设用户可以将他的闹钟设置为早上 08:00。然后,应用程序每 10 分钟检查一次当前温度,如果温度低于 0° 摄氏度,则将闹钟时间更改为 07:45,因为用户必须提早醒来清除汽车上的冰。
此外,当 "waking up" 应用程序时,当前(或更确切地说是最新接收的)温度应显示在 UI.
中
实现此目标的最佳方法是什么?我有一些关于来自 AsyncTasks/Services to/from 活动的 passing/receiving 数据的问题。
我的第一种方法是从 MainActivity 启动单个服务,将一些数据传递给该服务(例如警报启动的初始时间和用户的当前位置)。该服务然后有两个单独的 AlarmManagers。其中一个设置为执行实际警报(早上叫醒用户),另一个管理从互联网获取数据的时间间隔。
我的问题:
- 到目前为止,我的思路是否有意义?
- 传递和接收数据 to/from 服务的最佳方式是什么?我最好的猜测是使用意图传递和广播接收器从服务接收数据。这在这种特定情况下有意义吗?
恐怕不欢迎 post 问题,如果您之前没有付出任何努力。虽然我没有添加任何实际的源代码,但我希望你能看到我已经处理这些问题很长时间了,但在我了解应用程序的结构之前无法真正开始编码。
提前致谢
使用 AlarmManager
根据需要经常启动 IntentService
(在您的示例中,在用户计划起床前大约两个小时开始检查温度就足够了,也许再次比正常起床时间早一小时,最后半小时。只有在极端天气情况下才会更频繁。
没有必要在 03:33 a.m 准确检查温度。所以用
setInexactRepeating()
,这样会更省电。
另见 Scheduling Repeating Alarms
将结果写入 SharedPreferences
并让一个 IntentService
在正常唤醒时间前 15 分钟检查用户是否应在此时起床。在这种情况下取消正常的唤醒警报。通过 SharedPreferences
(想想邮箱)和本地 (!) 广播进行通信是个好主意 - 便宜又安全 :)
关于下面所述的问题,我已经到了需要决定是否要这样做的地步:
- 启动一次服务,其中有一个 AlarmManager,然后每 10 分钟启动一次查询。仅当用户将 "Onn-Off" 开关设置为 "Off" 时,该服务才会停止。
- 使用 AlarmManager 每 10 分钟启动一次 IntentService。此服务将仅在需要时启动,然后关闭
以下哪种方式更好: - 能够与其他 activities/services 交换服务(或 Intenservice)接收到的数据 - 电池使用 - 总体 "good coding habits" ?
谢谢!
原问题:
我是一名新手 Android 开发人员,遇到过我不知道如何解决的情况。我已经花了几天时间寻找解决方案,但找不到。
在尝试开发我的第一个应用创意时,我开始尝试从互联网接收和解析数据。到目前为止,我所取得的成就是生成一个查询,该查询通过 API 接收 JSON 数据并解析此 JSON。所有这些都在 AsyncTask 中完成。然后在屏幕上显示接收到的数据。
但是,出于我的应用创意的目的,我需要在后台完成此操作。我想到的是:
- 启动一个与我的 Asynctask 几乎具有相同逻辑的服务。该服务由 AlarmManager 管理,然后在特定时间间隔内请求、接收和解析数据。
现在棘手的部分开始了: 我收到的数据(假设每 10 分钟一次)将用于更改闹钟。因此,作为一个简单的示例,假设用户可以将他的闹钟设置为早上 08:00。然后,应用程序每 10 分钟检查一次当前温度,如果温度低于 0° 摄氏度,则将闹钟时间更改为 07:45,因为用户必须提早醒来清除汽车上的冰。 此外,当 "waking up" 应用程序时,当前(或更确切地说是最新接收的)温度应显示在 UI.
中实现此目标的最佳方法是什么?我有一些关于来自 AsyncTasks/Services to/from 活动的 passing/receiving 数据的问题。
我的第一种方法是从 MainActivity 启动单个服务,将一些数据传递给该服务(例如警报启动的初始时间和用户的当前位置)。该服务然后有两个单独的 AlarmManagers。其中一个设置为执行实际警报(早上叫醒用户),另一个管理从互联网获取数据的时间间隔。
我的问题: - 到目前为止,我的思路是否有意义? - 传递和接收数据 to/from 服务的最佳方式是什么?我最好的猜测是使用意图传递和广播接收器从服务接收数据。这在这种特定情况下有意义吗?
恐怕不欢迎 post 问题,如果您之前没有付出任何努力。虽然我没有添加任何实际的源代码,但我希望你能看到我已经处理这些问题很长时间了,但在我了解应用程序的结构之前无法真正开始编码。
提前致谢
使用 AlarmManager
根据需要经常启动 IntentService
(在您的示例中,在用户计划起床前大约两个小时开始检查温度就足够了,也许再次比正常起床时间早一小时,最后半小时。只有在极端天气情况下才会更频繁。
没有必要在 03:33 a.m 准确检查温度。所以用
setInexactRepeating()
,这样会更省电。
另见 Scheduling Repeating Alarms
将结果写入 SharedPreferences
并让一个 IntentService
在正常唤醒时间前 15 分钟检查用户是否应在此时起床。在这种情况下取消正常的唤醒警报。通过 SharedPreferences
(想想邮箱)和本地 (!) 广播进行通信是个好主意 - 便宜又安全 :)