Install相关的API,在Android 1.0时一个也没有。全是后续陆续增加进来的。 我们来看看他们的历史。
我们发现,除了4.2的是补充4.0的以外,基本上全是逢大版本才有更新:2.0,3.0,4.0,5.0.
功能:获取安装器的名字。 getter在Android 2.0出现了,但是setter要到Android 3.0才会出现。
原型:
String getInstallerPackageName (String packageName);功能:设置安装器的名字
原型:
void setInstallerPackageName (String targetPackage, String installerPackageName);功能:监听package verification广播。
原型:
void verifyPendingInstall (int id, int verificationCode);功能:拓展校验的超时时间
原型:
void extendVerificationTimeout (int id, int verificationCodeAtTimeout, long millisecondsToDelay);功能:获取PackageInstaller
原型:
PackageInstaller getPackageInstaller ();从Android 5.0开始,PackageManager提供了基于Session的PackageInstaller类。
PackageInstaller类有4大组件,在后面的函数中都会用到,我们看一下它的结构:
要创建Session,需要提供一个SessionParam对象。
SessionParams需要一个模式参数:
MODE_FULL_INSTALL:新的apk会替换旧的apk的模式。MODE_INHERIT_EXISTING:新的apk继承旧的apk.SessionParams有下面的方法可以设属性:
setAppIcon:设置应用图标setAppLabel:设置应用标签setAppPackageName:设置应用包名setInstallLocation:是否支持外置设备setOriginatingUid:设置UIDsetOriginatingUri:设置下载的UrisetReferenceUri:设置一个可选的UrisetSize: 这个Session中的所用apk的总字节数前一个SessionParams类都是set方法,这个SessionInfo类都是get方法
getAppIcongetAppLabelgetAppPackageNamegetInstallerPackageNamegetProcessgetSessionIdisActive上面两个类,一个都是getter,另一个都是setter,终于轮到Session类出场了,它封装都是操作
openRead:去读一个apkopenWrite:去写一个apkfsync:将流写文件commit:提交close:关闭这个Sessionabandon:放弃这个SessiongetNames:列出都打开了哪些apksetStagingProgress:设置进度事件方法:
onActiveChangedonBadgingChangedonCreatedonFinishedonProgressChanged创建一个安装的Session. 一旦Session创建了,以后就可以继续用,重启之后仍然管用。
原型:
int createSession (PackageInstaller.SessionParams params);参数:params,上面刚讲过的SessionParams
createSession创建了之后,还得靠openSession去获取一个Session对象去进行操作。
原型:
PackageInstaller.Session openSession (int sessionId);相当于调用Session的abandon方法。
原型:
void abandonSession (int sessionId);注册一个SessionCallback以接受事件
原型:
void registerSessionCallback (PackageInstaller.SessionCallback callback); void registerSessionCallback (PackageInstaller.SessionCallback callback, Handler handler);反注册callback
原型:
void unregisterSessionCallback (PackageInstaller.SessionCallback callback);原型:
List<PackageInstaller.SessionInfo> getAllSessions ();例程:
PackageInstaller pi = mPm.getPackageInstaller(); List<PackageInstaller.SessionInfo> sessions = pi.getAllSessions(); if(sessions!=null){ for(PackageInstaller.SessionInfo session: sessions){ Log.d(TAG,"Session:"+session.toString()); } }原型:
List<PackageInstaller.SessionInfo> getMySessions ();原型:
PackageInstaller.SessionInfo getSessionInfo (int sessionId);安装需要一个Session,删除就不用了,直接调这个就好。
原型:
void uninstall (String packageName,IntentSender statusReceiver);