Aandroid应用管理
>http://blog.csdn.net/sk719887916/article/details/50314017 skay整理。
>2016了 本篇成了我的开年之博,距上次做静默安装和辅助服务已经有半年之多,最近一直在做项目中的插件功能,也一直没时间整理平时接触的东西,甚至年终总结,今天就从经常用到的知识来开始2016的道路吧。(写在2016年初)
Aandroid的应用管理主要由PMS(PackageManagerService)来负责管理;上层上来由PackageManager来进行管理,通过PM我们可以得到设备上的所有安装包信息,包括未安装和安装过的, 未安装的包信息采用反射和未暴露的API也可以进行深度解析得到我们想要的信息。而应用的的安装和卸载也有PM负责。
PMS
今天我们主要说一下PackageManager,至于PMS来说和上层有Binder进行交互, PMS在实际开发中我们很少直接用到,但是我们上层通过PM来获取的一些基础信息,都需要PMS来调用底层,当通过看源码得知PackageManager沿用了Android面向接口编程的风格,比如`viewRoot`,`WindowManger`,`ActivityManager` 都采用了面向接口编程,这些Mgr为我们提供了一些基础的功能接口,具体都由各自的Service来动态注入Impl,就是我们通常说的热插拔,至于这么写的好处吗 这里稍微说两句,在接触过java编程久的朋友都知道面向接口的可扩展性很强,因为安卓源码也需要升级,谷歌工程师在下一个版本中或许就会新增一些api,那么这样设计的理念也便于源码的维护和升级,我们平时开发中也可以借鉴这种优雅的面向协议编程,当然iOS同样适用。
PackageManager
PackageManager 在android.content.pm包下,它主要来负责应用的解析,和APK的安装,卸载和更新,那么我们可以清晰得看到此类的以下方法
1)负责安装
private abstract void installPackage(
Uri packageURI, IPackageInstallObserver observer, int flags,)
2)卸载
private abstract void deletePackage(
String packageName, IPackageDeleteObserver observer, int flags);
安卓系统通过以上api和底层的pms交互进行安装,我们的普通apk无法直接安装的第三方应用的, 因为源码没有开放其方法,只有我们发送一条安装意图才可以交友pms来安装apk,具体由系统级别的apk(**包名com.android.packageinstaller**)来进行处理。
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TA