API8开始,你可以让你的应用程序被安装在外部存储设备。 您可以设置
android:installLocation
属性:
"
preferExternal
" or "
auto
"。
如果你声明“ preferExternal
“,您要求您的应用程序被安装在外部存储,但并不能保证你的应用程序将被安装在外部存储系统。如果外部存储满时,系统将其安装在内部存储。用户也可以将您的应用程序之间的两个位置。
如果你声明“ auto “,则表明您的应用程序可以安装在外部存储,但是你不必安装位置偏爱。该系统将决定在哪里安装您的应用程序,基于几个因素。用户也可以将您的应用程序之间的两个位置。
当您的应用程序安装在外部存储:
- 安装在外部存储设备上的应用程序性能并没有影响。
APK
文件是保存在外部存储中,但所有用户的私人数据,数据库,优化的dex
文件,并提取原生代码都保存在内部的设备内存。- 你的应用程序被存储的独特的容器,其中仅由最初安装它的移动设备可以被解密的随机生成的密钥是加密的。因此,应用程序安装在SD卡上只有一台设备。
- 通过系统设置,用户可以将您的应用程序移至内部存储。
警告:当用户启用USB大容量存储,与电脑共享文件,通过系统设置或卸载SD卡,外部存储设备卸载和外部存储上运行的所有应用程序,当即毙命。
向后兼容性
为您的应用程序安装在外部存储的能力是一个功能仅适用于API lv8(安卓2.2)或更高版本的设备上运行。现有的应用程序API等级8之前落成将始终安装在内部存储,并不能移动到外部存储(即使在设备API等级8)。但是,如果您的应用程序被设计为支持的API级别低于 8,你可以选择支持此功能的设备API等级8或更大,仍然是兼容使用API级别低于8的设备。
要允许安装在外部存储设备上,并保持与低于API等级8的版本兼容:
-
android:minSdkVersion
属性(低于 “8”的),并确定您的应用程序代码只使用API的兼容的等级。 - 为了编译您的应用程序,更改您的构建目标为API等级8。这是必要的,因为旧的Android库不支持
android:INSTALLLOCATION
属 性,将无法编译您的应用程序。
当您的应用程序使用API级别低于8,安装在设备上的android:installLocation属性被忽略,并且应用程序安装在内部存储。
注意:虽然XML标记将被忽略,像这样的老平台,你必须小心,不要使用minSdkVersion
编程API中引入API等级8,而低于“8”,除非你进行必要的工作,以提供向后兼容性你的代码。
应用程序不应该安装在外部存储
当用户使自己的电脑(或以其他方式卸载或删除的外部存储)USB大容量存储共享文件,安装在外部存储和当前正在运行的任何应用程序被杀害,直到USB大容量存储被禁用,重新安装外部存储设备。除了 查杀应用程序,使用户无法使用它,这样可以破坏某些类型的应用程序,一个更严重的方式。为了让您的应用程序始终像预期的那样,你不应该让你的应用程序被安装在外部存储,如果它使用以下任何功能,由于外部存储卸载时引用后果:
-
服务
-
正在运行的
服务
会被杀死,并重新安装外部存储时,将无法重新启动。你可以,但是,广播ACTION_EXTERNAL_APPLICATIONS_AVAILABLE的
意图,这将外部存储设备上安装的应用程序时通知应用程序已经成为系统再次注册。这时候,你可以重新启动您的服务。
报警服务
-
注册
AlarmManager的
报警将被取消。您必须手动重新注册任何报警时重新安装外部存储。
输入法引擎。
- 你的输入法 将被替换为默认输入法。重新安装外部存储时,用户可以打开系统设置再次启用您IME。 动态壁纸
- 你运行的动态壁纸, 将被替换默认的Live壁纸。重新安装外部存储时,用户可以再次选择您的动态壁纸。 应用程序!
- 从主屏幕上,你的应用程序部件 将被删除。重新安装外部存储时,您的应用程序部件将 无法 供用户选择,直到系统复位(通常系统重启)。 客户经理
-
您的帐户创建
的AccountManager
会消失,直到外部存储设备重新安装。
同步适配器
-
您的的
AbstractThreadedSyncAdapter
和其同步功能将无法正常工作,直到重新安装外部存储。
设备管理员
-
您的的
DeviceAdminReceiver
和其所有的管理功能将被禁用,它可以有不可预见的后果,设备的功能,外部存储设备重新安装后,可能会持续。
广播接收机听“引导完成”
-
该系统提供了
ACTION_BOOT_COMPLETED
广播之前被安装到外部存储设备。如果您的应用程序安装在外部存储,它可以永远不会收到此广播。
如果您的应用程序使用任何上面列出的功能,你不应该让你的应用程序安装在外部存储。默认情况下,系统不会让你的应用程序安装在外部存储,所以你不必担心你现有的应用程序。不过,如果你确定你的应用程序不应该安装在外部存储,那么你应该明确这一点声明android:installLocation的
“ internalOnly
“属性。虽然这并没有改变默认的行为,它明确规定,您的应用程序只能安装在内部存储,并作为你和其他开发人员,这个决定已经作出提醒。
应用程序应该安装在外部存储
大型游戏是更常见的类型,应该让外部存储设备上安装的应用程序,因为游戏通常不提供额外的服务,不活动时。当外部存储变得不可用,一个游戏进程被杀死了,应该没有明显的效果,当存储再次变为可用的用户重新启动游戏(假设游戏妥善保存其状态在正常 活动的生命周期)。
如果您的应用程序的APK文件需要几兆,您应该谨慎考虑是否要启用应用程序安装在外部存储,使用户可以保留其内部存储空间。