不应该安装在外部存储器上的应用程序
当用户启用USB存储器来跟计算机共享文件时(或者是卸载或移除外部存储器),任何被安装在外部存储器上,并且当前正在运行的应用程序都会被杀死。在USB存储器被禁用和外部存储器被重新挂载到设备上之前,系统不会有效的感知到引用程序的存在。除了终止应用程序并让它对用户无效之外,这样做还可以中断某些更严重的应用程序类型。为了让你的应用程序能够像预期的那样,如果它使用了以下功能,你不应该允许你的应用程序被安装在外部存储器上,由于在外部存储器被卸载时,会引发一些后果:
Services
在外部存储器被卸载时,正在运行的Service将会被终止,而在外部存储器重新被挂载时,它也不会被重启。但是,你可以注册ACTION_EXTERNAL_APPLICATIONS_AVAILABLE类型的广播Intent,当被安装在外部存储器上的应用再次对系统有效时,它会给你的应用程序发通知。这时,你可以重启你的服务。
Alarm Services
你用AlarmManager注册的闹钟会被取消。在外部存储器被重新挂载时,你必须手动重新注册闹钟。
Input Method Engines
你的IME会被默认的IME替代。当外部存储器被重新挂载时,用户可以打开系统设置重新启用你的IME。
Live Wallpapers
你的正在运行的LiveWallpaper会被默认的LiveWallpaper所替代。当外部存储器被重新挂载时,用户可以再次选择你的LiveWallpaper。
App Widgets
你的AppWidget会被从主屏上删除。当外部存储器被重新挂载时,你的AppWidget不会自动的对用户有效,除非系统重新设置主应用程序(通常会一直到系统重启)。
Account Managers
你用AccountManager创建的账号,会一直到外部存储器被重新挂载才会显示。
Sync Adapters
直到外部存储器被重新挂载,你的AbstractThreadedSyncAdapter和所有的异步功能才会工作。
Device Administrators
你的DeviceAdminReceiver和所有的管理员能力会被禁用,这可能会产生一些不可预知的结果,甚至会持续到外部存储器被重新挂载之后。
Broadcast ReceiversListening For “boot completed”
在外部存储器被从设备上卸载之前,系统会发送ACTION_BOOT_COMPLETED广播。如果你应用程序被安装在外部存储器上,它就不会接收到这个广播。
Copy Protection
如果你的应用程序使用了GooglyPlay的复制保护功能,你的应用程序不会被安装在设备的SD卡上。但是,如果你使用了GooglePlay的ApplicationLicensing来代替,你的应用
程序就可以被安装在内部或外部存储器上,包括SD卡。
如果你的应用程序使用了上述功能,你就不应该允许你的应用程序安装在外部存储器上。默
internalOnly”值的anroid:installLocation属性来明确说明。尽管这样不会改变默认行为,但它会明确指示你的应用程序只能被安装在内部存储器上,并告诉其他开发者是已经被决定的事。
应该安装在外部存储器上的应用程序
简单的说,任何不使用上述所列功能的应用程序安装在外部存储器上是安全的。通常一些大型游戏会允许把应用程序安装在外部存储器上,因为通常游戏在不活动时不会提供额外的服务。当外部存储器无效,且游戏进程被杀死时,不会影响外部存储器再次有效且用户重启游戏时的可视效果(假定游戏在标准的Activity生命周期中正确的保存了它们的状态)。
如果你的应用程序需要几M字节存储空间,你就应该认真考虑是否允许应用程序安装在外部存储器上,以便用户可以保留内部存储的空间。
标签:外部,存储器,应用程序,重新,挂载,Android,安装 From: https://blog.51cto.com/u_548275/6237737