Android:将从前台服务接收到的数据显示到 activity 内的 MapView 上

Android: Display received data from a foreground service onto a MapView inside an activity

我已经实施了一个 foreground service,每 10 秒向我提供一次当前位置。使用收集的数据,我想在地图上显示一条路线。

但是,在处理位置跟踪和服务时,phone 的屏幕不会一直亮着,因为要省电。因此 activity 将调用 onPause()onStop() 方法并且 MapView 更新的最早点将在 onResume() 之后。到目前为止,每次向 activity 广播时,我都会发送所有 LatLng 对象的列表,清除目前为止的路线,并使用 Polyline [=21= 再次显示路线]

它完成了工作,但不知何故我发现它非常低效,就系统资源而言。

备选方案将在每次广播时将接收到的 LatLng 对象保存在列表中,例如在 activity 中初始化的 List<LatLng> points=new ArrayList<LatLng>();,并且为了显示数据,计算接收到的坐标与接收到的坐标之间的差异已保存在 Activity 的列表中,仅显示 Polyline.

的列表

你怎么看?还有比这两个更好的方法吗?

设置当前路线的唯一标识。当服务为运行时,将点存储到数据库中。然后广播您的事件(可能与您当前的路线 ID)并与您的 Activity 分开加载它们以获得积分。

首先,我不得不提到 Whosebug 是关于代码优化、错误、软件问题和解决方案的问题,而不是想法。

每 10 秒一次的前台服务在 CPU 和电池方面会很昂贵。话虽如此,有几种方法可以解决这个问题:

// Store data in somekind of database
1- SQLite (On the phone not recommended as writing and reading database values can take alot of time and be resource-extensive)
2- Firebase(Remote best option)
3- SharedPrefernces(On the phone but single key-value pairs works for your case )

Firebase 教程:https://www.androidauthority.com/create-a-gps-tracking-application-with-firebase-realtime-databse-844343/

//To minimize resource usages instead of a foreground service consider but try to increase your time between requests.
1-AlarmManger
2-setWindow
3-setExact

最后,请不要删除旧的 polyline 并创建一个新的,因为图形是内存和电池的敌人。只需执行以下操作:

LatLng somePoint = new LatLng(location.getLatitude(), location.getLongitude());

//Then add this point to the existing `polyline`:

List<LatLng> fullPointList = somePolyLine.getPoints();
fullPointList.add(somePoint);
somePolyLine.setPoints(fullPointList);