一、android支持软件安装在设备的内置存储器(Flash)和外部存储器(Sd card)
1.关于android软件安装位置,android系统支持软件本身决定安装的位置(internal或者External),这就要说一下android:installLocation配置属性:
android:installLocation隶属于AndroidManifest.XML中的manifest节点.如下所示:
android:installLocation可以设置为”auto”、”internalOnly”、”preferExternal”三个值中的任何一个.
auto:程序可能被安装在外部存储介质上(例如:SD Card),但是默认会被安装到手机内存中.当手机内存为空时,程序将被安装到外部存储介质上. 当程 序安装到手机上后,用户可以决定把程序放在外部储介质还是内存中.
internalOnly:默认值.当设置为该值时,程序只能被安装在内存中,如果内存为空,则程序将不能成功安装.
preferExternal:将程序安装在外部存储介质上,但是系统不保证程序一定会被安装到外部存储介质上.当外部存储介质不可以或空时,程序将被安装到内存中.程序使用了for ward-locking机制时也将被安装到内存中,因为外部存储不支持此机制.程序安装后,用户可以自由切换程序应该在外部还是内部存储介质上.
向后兼容性:
声明了android:installLocation,当android:minSdkVersion小于8时,android:installLocation将被忽略,当android:minSdkVersion大等于8时,系统将使用我们指定的android:installLocation.
因此开发这可以根据软件的需要,设置这个属性。
2.当程序被安装到外部存储介质时,
① .apk文件将被移动到外部存储介质上,但是程序的数据仍然会在内存中
② 保存.apk文件的容器将会使用一个随机生成的密钥进行加密,这样只有安装该程序的设置可以使用存在外部存储介质上的数据.
警告:当外部存储介质被卸载时,安装在该外部存储介质上的程序将立刻被终止掉!
3.不能被安装在外部存储器的软件特点
当程序使用了Google Play的Copy Protection特性时,只能安装到内存中.
当我们的程序具有如下行为时我们不应该将程序安装到外部存储介质上
①Service
正在运行的服务将被终止,当外部存储介质被重新加载时服务不会被重启.
②Alarm Service
闹钟服务将被取消,开发者必须在外部存储介质重新加载后重新注册闹钟服务.
③Input Method Engines
输入法将被换成系统输入法,当外部存储介质被重新加载后用户可以通过系统设置来启动我们的输入法
④Live Wallpapers
我们的动态壁纸将被替换为默认的动态壁纸.外部存储介质重载后,用户可以更换回来.
⑤Live Folders
我们的动态文件夹将被移出.
⑥App Widgets
我们的小部件将被移出,通常只有系统重启后我们的小部件才可用.
⑦Account Managers
使用AccountManager创建的账户将会消失,直至存储介质被重新加载.
⑧Sync Adapters
只有外部存储介质被重新加载时,我们的同步功能才可用
⑨Device Administrators
我们的DeviceAdminReceiver将会失效
⑩监听开机结束事件
系统会在加载外部存储介质之前发送ACTION_BOOT_COMPLETED广播.因此安装在外部存储介质的程序将不能接受开机广播.
通常,只要我们没有使用上述的特性,我们就可以将我们的程序安装到外部存储介质上.例如,大的游戏程序.当我们的APK文件有几M大时我们应该认 真的考虑是否要将程序移动到外部存储介质上以帮助用户节省内存.
二、android支持软件安装在不同位置
虽然说软件自生可以配置安装的位置,但是系统还是可以根据本身的情况,也可以是一些人的意愿改变软件的安装位置:通过改变安装程序来制定软件的安装位置。
PackageManager mPm = this.getPackageManager();
int installflag = 0;
installflag |= PackageManager.INSTALL_INTERNAL;//安装应用到flash
installflag |= PackageManager.INSTALL_EXTERNAL;//安装应用到sd card
PackageInstallObserver observer = new PackageInstallObserver();
mPm.installPackage(Uri uri, IPackageInstallObserver observer, int installflag, String packagename);
/**
* get install result.
*/
class PackageInstallObserver extends IPackageInstallObserver.Stub {
public void packageInstalled(String packageName, int returnCode) {
}
}
三、android 支持软件搬家
软件搬家就是把安装的flash中的软件移动到sd card中,或者把安装在sd card中的软件安装到flash中,软件搬家理论上android系统上的软件,除了系统软件之外都可以在flash和sd中来回移动。
public static final int CAN_MOVE_TO_FLASH = 1;//MOV APP TO FLASH
public static final int CAN_MOVE_TO_SDCARD = 2;//MOV APP TO SDCARD
PackageManager mPm = this.getPackageManager();
int moveflag = CAN_MOVE_TO_FLASH;或者int moveflag = CAN_MOVE_TO_SDCARD;
PackageMoveObserver Observer = new PackageMoveObserver();
mPm.movePackage(String packagename, IPackageMoveObserver observer, int moveflag)
/** get move app result. */
class PackageMoveObserver extends IPackageMoveObserver.Stub {
public void packageMoved(String packageName, int returnCode)
throws RemoteException {
}
}