manifest标签
android:installLocation
- 作用:通过设置该属性可以使得开发者以及用户决定程序的安装位置。
- auto:程序可能被安装在外部存储介质上(如SD卡),但是默认会被安装到手机内存中。当手机内存为空时,程序将被安装到外部存储介质上。当程序安装到手机上后,用户可以决定把程序放在外部存储介质还是内存中。
- internalOnly:默认值。当设置该值时,程序只能被安装在内存中,如果内存为空,则程序不能安装成功;用户不可以主动选择安装在外部存储上。
- preferExternal:安装在外部存储介质上,但是系统不保证程序一定会被安装到外部存储上。当外部存储为空或不可用时,程序将被安装到内存中。程序使用了forward-locking机制时也将被安装到内存中,因为外部存储不支持此机制。程序安装后,用户可以自由切换程序应该在外部还是内存介质上。
- 注意事项1:当程序使用了Google Play的Copy Protection特性时,只能安装到内存中。
- 注意事项2:当程序被安装到外部存储中,apk文件将被移动到外部存储介质上,但是程序的数据仍在内存中;保存apk文件的容器将会使用一个随机生成的密钥进行加密,这样只有安装该程序的设置可以使用存在外部存储介质上的数据。
- 注意事项3:当外部存储介质被卸载时,安装在外部存储介质上的程序将立刻被终止掉。
- 当程序具有以下行为时不建议安装在外部存储上:
- Serviece:正在运行的服务将被终止,当外部存储介质被重新加载时服务不会被重启。
- Alarm Service:闹钟服务将被取消,开发者必须在外部存储介质中重新加载后重新注册闹钟服务。
- Live Wallpapers:我们的动态壁纸将被替换为默认的动态壁纸。外部存储介质重载后,用户可以更换回来。
- Live Folders:我们的动态文件夹将被移出。
- App Widgets:我们的小部件将被移出,通常只有系统重启后我们的小部件才可用。
- Account Managers:使用Account Managers创建的账户将会消失,直至存储介质被重新加载。
- Sync Adapters:只有外部存储介质被重新加载时,我们的同步功能才可用。
- Device Administrators:我们的DeviceAdminReceiver将会失效。
- 监听开机结束事件:系统会在加载外部存储介质之前发送ACTION_BOOT_COMPLETED广播。因此安装在外部存储介质的程序将不能接受开机广播。
android:sharedUserId | android:sharedUserLabel
- 当apk安装时,userid这个标识就会产生。apk在设备上的整个生命周期中,这个id不再改变。不同设备上同一个应用包可能有不同的userid;同一个设备上每个应用包都有自己独立的userid。
- userid的特点:
- 作为apk身份的标识。
- userid对应一个Linux用户,所有不同apk间数据是禁止访问的。
- 不同的apk之间想要互相访问数据的方式:
- Share Preference、Content Provider:apk通过指定接口和数据供其他apk读取,开发者需要实现接口和指定share的数据。
- 在manifest中配置相同的userid:通过共享userid,拥有相同的userid的用户可以配置成运行在同一进程当中,因此默认就是可以互相访问任意数据的。也可以配置在不同进程中,彼此之间就像访问自己的数据一样访问批次的数据库和文件。
通过以下代码可以获取两个userid相同程序中的资源等:
Content content = this.createPackageContent("配置的userid",Content.CONTENT_IGNORE_SECURITY);
- 基于安全考虑,两个apk需要有相同的签名。
- android:sharedUserLabel:这个属性给共享userid定义了一个用户可读的标签。这个标签必须用字符串资源来设置,不能使用原生的字符串。
总结:如果想要两个apk之间共享数据,需要满足以下条件:
(1) apk的签名必须相同。
(2) android:shareUserId的值必须相同。
(3) 如果想要运行在同一个进程中,必须在manifest标签中为android:process设置相同的值。
网友评论