App Install Location
从API level 8开始,用户可以将应用程序安装到外部存储设备中(如SD卡)。该属性可以通过android:installLocation属性在manifest中声明。如果不声明该属性,应用程序将只会安装在内存中,而且不能移动到外部存储设备。
要将应用程序安装到外部存储设备中,只需修改manifest文件,在manifest元素中添加android:installLocation属性,属性值为preferExternal或auto。例如:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="preferExternal"
... >
如果该属性值设为"preferExternal",表明用户要求应用程序安装在外部存储设备中,但是系统并不保证应用程序真的安装在外部存储设备中。如果外部存储设备的空间已满,系统仍然会将应用程序安装在内存中。用户也可以在两个位置之间移动应用程序。
如果该属性值设为"auto",表明应用程序可能安装在外部存储设备中,但是用户本身对安装位置没有特殊要求。系统会根据多种因素决定将应用程序安装在哪里。用户也可以在两个位置之间移动应用程序。
当应用程序安装在外部存储设备中时:
只要外部存储设备装载在设备上,应用程序的性能就不会受到影响。
.apk文件是保存在外部存储设备中的,但是所有的私有用户数据、数据库、优化的.dex文件和提取的本地代码都是保存在设备的内存中的。
保存应用程序的唯一容器经过一个随机产生的密钥进行加密。该密钥只能由最初安装该程序的设备解密。因此,安装在SD卡上的应用程序只能在某一个固定的设备上运行。
用户可以通过系统设置将应用程序移动到内存上。
注意: 当用户使用USB大容量存储器与计算机共享文件时,或通过系统设置卸载SD卡时,外部存储设备将从本设备卸载,并且所有在该外部存储设备中运行的应用程序将立刻被关闭。
向后兼容
应用程序能够安装在外部存储设备中是API level 8 (android 2.2) 以上的设备的特点。在此之前的应用程序只能安装在内存中,且不能移动到外部存储设备中(即使设备是API level 8的)。然而,如果应用程序设计的时候就支持低于API level 8的设备的,那么用户可以选择在API level 8及以上的设备上是否需要支持这一特性,并且在使用API level 8 以下的设备的时候仍然兼容。
要在外部存储设备中安装程序,并且与低于API level 8 的版本兼容,需要做到以下几点:
1. 在manifest元素中添加android:installLocation属性,设属性值为"auto"或"preferExternal"。
2. 保持android:minSdkVersion属性不变(低于8的某个值),确保应用程序的代码能够兼容该等级。
3. 为了能够编译程序,将生成目标设为API level 8。 这一步必不可少,因为旧的android库不识别android:installLocation属性,当该属性存在时,应用程序将无法编译通过。
当应用程序安装在低于API level 8 的设备中时,android:installLocation属性将被忽略,应用程序将安装在内存中。
注意: 尽管在老的平台上,类似这种的XML标记会被忽略, 但是在android:minSdkVersion低于8时,编程时也一定要注意避免使用API level 8 推荐的写法,除非在代码中已经提供了向后兼容。更多关于应用程序代码中的向后兼容的信息,请参考Backward Compatibility条目。
不应装在外部存储设备的程序
当用户使用USB大容量存储器与计算机共享文件时(或相反地,卸载或移除外部存储设备时),任何安装在外部存储设备中、正在运行的应用程序将会被关闭。直到大容量存储设备不可用、随机又重新加载到设备中时,系统才会无法识别应用程序。除了关闭应用程序使其不可用之外,有些情况下会严重损坏某种类型的应用程序。鉴于以上后果,如果应用程序有以下特点,为了让应用程序持续照常运行,用户应该允许应用程序安装在外部存储设备上。
服务
当外部存储设备重新加载时,原本运行的服务将被关闭,且不能重启。然而,用户可以注册ACTION_EXTERNAL_APPLICATIONS_AVAILABLE广播,该广播会通知安装在外部存储设备上的应用程序系统再次可用了。那时,用户就可以重启服务了。
警告服务
使用AlarmManager注册的所有警告将会取消。当外部存储设备重新加载时,用户必须重新手动注册。
输入法
用户的输入法将会由默认的代替。当外部存储设备重新加载时,用户可以通过系统设置重新启用自己的输入法。
动态壁纸
运行中的动态壁纸将会被默认的动态壁纸代替。当外部存储设备重新加载时,用户可以重新选择动态壁纸。
活动文件夹
活动文件夹将会从主页面移除。当外部存储设备重新加载时,用户可以重新添加活动文件夹到主页面。
窗口小部件
用户的应用程序窗口小部件将会从主页面移除。当外部存储设备重新加载时,窗口小部件不可用,除非用户重置了主页面应用程序(通常是系统重启)。
帐号管理
由AccountManager创建的帐户将会消失,直到外部存储设备重新加载为止。
同步适配器
AbstractThreadedSyncAdapter及其所有的同步功能将失效,直到外部存储设备重新加载为止。
设备管理器
DeviceAdminReceiver及其管理功能将会失效,这将会给设备功能带来无法预料的后果,这个后果将一直持续到外部存储设备重新加载为止。
监听“启动完成”的广播接收器
在外部存储设备加载到设备之前,系统负责ACTION_BOOT_COMPLETED广播。如果应用程序安装在外部存储设备中,将无法接收到这个广播。
复制保护
如果使用了android电子市场的复制保护,应用程序将无法安装在SD卡上。然而,如果使用了android电子市场的应用程序许可证,应用程序将可以安装在内存或外部存储设备上,包括SD卡。
如果应用程序包含以上特点,那么用户不应该将应用程序安装在外部存储设备中。 默认情况下,系统不允许将应用程序安装到外部存储设备中,所以用户不用担心已经存在的应用程序。 然而,如果用户非常肯定应用程序永远都不会安装在外部存储设备中,那么用户可以显示地声明android:installLocation属性,并将属性值设为"internalOnly". 尽管这样不会改变系统的默认属性,但是这样非常明确地声明了应用程序只能安装在内存中,给了用户和其他开发者一个明确的提示。
应该装在外部存储设备的程序 www.zzzyk.com
简单地说,任何没有使用上述特点的应用程序,安装在外部存储设备时都是安全的。大型游戏通常就是应该装在外部存储设备的程序类型,因为游戏不使用时通常不需要提供额外的服务。当外部存储设备不可用时,游戏进程结束,当存储设备再次可用时,不应该有明显的影响,用户重启游戏即可(假设游戏在正常的活动周期内恰当地存储了游戏状态)。
如果apk文件需要好几兆空间,用户就需要考虑是否将应用程序安装在外部存储设备上,为内存保留更多的空间。
补充:移动开发 , Android ,