3

我正在为 Android 开发地图渲染应用程序。地图数据相当大,大约 1.1 Gb。由于 .apk 大小在市场和手机中都有限制,因此建议在应用程序启动时下载它。

这是我现在使用的模式:
1. 主要活动(用于渲染地图)检查数据是否可用,如果没有,我启动下载活动
2. 下载活动启动本地服务
3. 服务下载 zip 文件并解压地图数据
4. 服务向下载活动和通知发送事件

我生成了一项服务,因为整个过程可能需要 30 分钟到几个小时,具体取决于电话和网络。

但是我无法确保只有一个程序实例正在运行,我尝试了所有的 launchmode 属性组合都没有帮助。

正如您可能理解的那样,运行的两个实例会使下载/解压缩崩溃。

这真是令人沮丧!现在我正在对 sdcard 文件锁进行一些丑陋的读/写操作,并且它大部分时间都在工作以确保只有一个实例正在运行。

我的目标是 Android 1.6 及更高版本。

4

2 回答 2

1

为避免多个实例出现问题,您应该使用远程服务而不是本地服务。这样,您只能拥有一个服务实例,该实例将下载应用程序所需的数据。

于 2011-02-08T13:21:06.607 回答
0

1.1GB 对移动设备来说是一个巨大的数据量。即使通过wifi,除非连接非常好,否则正如您所说,它需要时间,并且还会影响手机的性能。我预计用户的体验会很糟糕——他们的手机在下载过程中会很慢,在解压这么多数据的过程中可能无法使用,并且应用程序本身在下载数据之前根本无法使用已满(可能需要重试几次)。

如果是我,我会寻找一种方法来分解数据,也许是按地理区域,然后以包的形式下载。这样,如果包下载失败,应用程序可以重试,并且用户在某种程度上仍然可以使用该应用程序。您说您的应用程序是地图应用程序,因此您可以识别用户的位置/国家并首先下载最合适的包。这是否可行将归结为用户是否根本无法在没有所有数据的情况下使用该应用程序。

问题是 Android 应用程序可能在任何时候都被 GC 处理,因此您需要让应用程序运行相对较长的时间来进行密集工作,但在后台进行竞争。用户需要做的就是打开一个像浏览器这样的大应用程序,你的服务很可能会被关闭。通过进行一次大规模下载交易,您将自己逼入绝境。

或者,您能否在 SD 卡上物理提供数据?这不是一个很好的解决方案,但考虑到数据集的大小,它似乎值得考虑。

于 2011-02-08T13:13:53.443 回答