我有一个Android应用程序,它接收和处理来自传感器的数据。它包括一个主活动类和一个服务类。服务类在后台运行以接收和保存来自传感器的数据。活动类有一个历史图表,显示100天前的每日平均值。活动和服务的生命周期应该是独立的,因为即使活动不运行,服务也应该在后台继续接收数据。
这是我当前的实现。我使用共享首选项让活动访问来自服务的数据。每次新数据到达时,服务将数据放入arrayList中,然后将arrayList序列化为json,并将json保存到共享首选项中。这不是很有效,因为每当我想保存新数据时,我都需要从首选项中获取整个json数组,反序列化它,添加数据,然后放回json数组。我知道可能有办法追加新的json对象json数组字符串没有反序列化,但我还没有弄清楚如何。然而,即使这是可行的,我认为它仍然是不高效的,因为整个json数组仍然需要从首选项检索,并需要为这个本地对象分配内存。此外,当更新图形时,整个json仍然需要反序列化。
所以我在想是否有一种方法可以保持数组列表作为服务的一个字段,并让主活动直接访问这个字段。我做了很多搜索,但还没有找到一个好的解决方案。这听起来可能是一个愚蠢的问题,但任何帮助都很感激,因为我是Android的新手。此外,我想知道一般哪种实现是首选,如果有更好的解决方案?谢谢你的帮助。
更好的方法是结合使用sqlite和广播接收器。每当有新数据到达时,就将其保存到sqlite数据库中,并触发广播。
每当检索到新的传感器值时触发自定义广播:
Intent newSensorValues = new Intent("NEW_SENSOR_VALUE");
//Add the new sensor values as extras to the intent.
newSensorValues.putExtra..
...
sendBroadcast(newSensorValues);
//You'll also want to save the data to the sqlite database here.
saveToDb();
为什么触发一个广播——从服务更新活动,每当活动在屏幕上。
在你想要显示图形的活动中,你注册一个类型为"NEW_SENSOR_VALUE"的BroadcastReceiver
。因此,每当我们获得新的广播时,您只需使用intent中传递的数据来更新map。您还将注销活动的onPause()
中的接收器,以便在活动暂停时不更新映射。
//Inside onResume() :
this.registerReceiver(newSensorValueReceiver, new IntentFilter(
"NEW_SENSOR_VALUE"));
//Inside onPause() :
this.unregisterReceiver(newSensorValueReceiver);
//Broadcast Receiver Class.
private BroadcastReceiver newSensorValueReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
intent.getExtra...
updateGraph();
}
};
活动onCreate()
内部:
fetchValueFromDb();
updateGraph();
这种方法的好处:
- 您只需要在活动打开时从数据库访问数据。其余时间,每当接收到新的传感器值时,只需将其保存到sqlite db中。
- 图形总是实时更新的。
为什么不使用sqlite3来保存数据?当新数据到达时,您可以将其保存到sqlite3。当你想在活动中显示它们时,你只需要从数据库中读取,甚至可以选择显示哪些记录。