我正在开发Android的地图渲染应用程序。地图数据相当大,约为1.1 Gb。由于市场和手机中的.apk大小都有限制,建议在应用程序启动时下载。
这是我现在使用的模式:
1.主要活动(用于渲染地图)检查数据是否可用,如果不是,我开始下载活动
2.下载活动启动本地服务
3.服务下载zip文件并解压缩mapdata
4.服务将事件发送到下载活动和通知
我产生了一项服务,因为整个过程可能需要一些时间,从30分钟到几个小时,具体取决于电话和网络。
但是我无法确保只有一个程序实例正在运行,我已经尝试了launchmode属性的所有组合,没有任何帮助。
如您所知,运行的两个实例将导致下载/解压缩。
这真令人沮丧!现在我正在对sdcard文件锁进行一些丑陋的读/写操作,并且它大部分时间都在工作以确保只有一个实例正在运行。
我的目标是Android 1.6及更高版本。
答案 0 :(得分:1)
为避免多个实例出现问题,您应使用remote service而不是本地服务。这样,您只能拥有一个服务实例,它将下载应用程序所需的数据。
答案 1 :(得分:0)
1.1GB到移动设备是一个庞大的数据量。即使通过wifi,除非连接非常好,否则需要时间,正如你所说的那样,也会影响手机的性能。我希望用户的体验很糟糕 - 他们的手机在下载过程中会很慢,在打开这么多数据的过程中可能无法使用,而且在将数据下载到应用程序之前,应用程序本身根本无法使用已满(可能需要多次重试)。
如果是我,我会寻找一种方法来打破数据,可能是按地理区域划分,并将其下载到包中。这样,如果软件包下载失败,应用程序可以重试,用户仍可以在某种程度上使用该应用程序。你说你的应用程序是一个地图应用程序,所以也许你可以识别用户的位置/国家,并首先下载最合适的包。这是否有效将归结为用户是否完全无法在没有所有数据的情况下使用该应用程序。
问题是Android应用程序可能在任何时候都是GC,因此您需要让应用程序运行相对较长的一段时间才能进行密集的工作,但在后台进行竞争。用户需要做的就是打开一个像浏览器这样的大应用,你的服务可能会被关闭。通过单一的大规模下载交易,您可以将自己置于角落。
或者,您可以在SD卡上物理提供数据吗?这不是一个很好的解决方案,但考虑到数据集的大小,似乎值得考虑。