小编Lui*_*uis的帖子

Android上长期运行服务的最佳架构

我将非常感谢有关如何处理操作系统查杀长期服务的一些指导.

业务场景:

应用程序记录BTT轨道,可能持续数小时.它还可以在地图上显示轨道以及相关统计数据.

应用程序用户界面使用户能够开始/停止跟踪记录并在地图上查看实时跟踪.

在开始跟踪记录之后,用户可以退出应用程序并关闭屏幕(以节省电量),并且只有服务将保持运行以保持记录更新到数据库(显示通知),直到用户再次启动活动并要求停止记录,这导致服务终止.

问题:

在可变时间(从40分钟到1个半小时)之后,录制服务在没有任何警告的情况下被杀死.由于BTT出场可能需要几个小时,这导致跟踪录音不完整.

一些其他信息:

服务以启动START_STICKY并获取PARTIAL_WAKE_LOCK,并在与主活动相同的过程中运行.

以用户定义的速率从1秒到几分钟获取(并记录)新位置.我从Android文档中了解到,这是长期运行服务的预期操作系统行为.

题:

拥有性能良好的应用程序以满足业务场景要求的最佳架构设计方法是什么?

我可以想到几个选项(我不喜欢它们中的任何一个),但我希望某人如何面对并解决类似问题的指导:

  • 使用广播接收器(理想情况下,如果可能,连接到位置管理器)使服务仅在获取新位置时运行?
  • 不要让用户离开主要活动(导致用户体验下降)?
  • 如果需要,让警报广播接收器重新启动服务吗?

感谢所有能够就此主题分享一些智慧的人.

service android android-service android-lifecycle

17
推荐指数
1
解决办法
3976
查看次数

路径() - 智能彩色片段

背景

我正在开发一个在地图上显示路径的应用程序(谷歌地图和OpenStreet地图).波纹输出示例:

路径

为了绘制上述路径,我使用以下方法:

private void drawWithoutElevation(Canvas canvas, Projection projection){
    if(rebuildRequired)
        pathBuild();
    else{ //check if path need to be offset
        if(offsetRequired){
            path.offset(offset.x, offset.y);
        }
    }
    canvas.drawPath(path, paint); 
}
Run Code Online (Sandbox Code Playgroud)

上述方法需要大约1.5ms来绘制10.000点,这是可以接受的.

但是,我还希望根据点高度显示使用不同颜色的路径.波纹输出示例:

路径2

由于我找不到为每个路径段定义不同颜色的方法,我尝试了以下方法:

方法1

最明显的解决方案,canvas.drawLine()在路径中的每个点之间使用.示例:

private void drawWithElevation(Canvas canvas, Projection projection){
    for(int i=1; i<geoArrList.size(); i++){
            paint.setColor(geoArrList.get(i));
            canvas.drawLine(pPrev.x, pPrev.y, p1.x, p1.y, paint);
            pPrev.set(p1.x, p1.y);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

对于相同的10.000点,这导致非常令人失望的约80ms的时间.

方法2

以离散的步骤分割高度,并建立一个Path对象列表,每个高度段更改一个.代码示例如下:

private void drawWithElevation(Canvas canvas, Projection projection){
    if(rebuildRequired)
        pathBuild();
    for(int i=0; i<pathSegments.size(); i++){
        if(needOffset){
            pathSegments.get(i).path.offset(offsetX, offsetY);
        }
        paint.setColor(pathSegments.get(i).color);
        canvas.drawPath(pathSegments.get(i).path, paint); 
    } …
Run Code Online (Sandbox Code Playgroud)

java graphics maps android android-mapview

6
推荐指数
1
解决办法
563
查看次数