Manifest.xml

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设置相同的值。

uses-permission标签

application标签

activity标签

你可能感兴趣的:(Manifest.xml)