Android应用生死轮回的那些事儿(5) - 武器库(3)- Installer相关工具
Install相关的API,在Android 1.0时一个也没有。全是后续陆续增加进来的。
我们来看看他们的历史。
我们发现,除了4.2的是补充4.0的以外,基本上全是逢大版本才有更新:2.0,3.0,4.0,5.0都有新货。
Install相关的API发展史
Android 2.0新增的API - getInstallerPackageName
功能:获取安装器的名字。
getter在Android 2.0出现了,但是setter要到Android 3.0才会出现。
原型:
String getInstallerPackageName (String packageName);
Android 3.0新增API - setInstallerPackageName
功能:设置安装器的名字
原型:
void setInstallerPackageName (String targetPackage, String installerPackageName);
Android 4.0新增API - verifyPendingInstall
功能:监听package verification广播。
原型:
void verifyPendingInstall (int id, int verificationCode);
Android 4.2新增API - extendVerificationTimeout
功能:拓展校验的超时时间
原型:
void extendVerificationTimeout (int id, int verificationCodeAtTimeout, long millisecondsToDelay);
Android 5.0新增API - getPackageInstaller
功能:获取PackageInstaller
原型:
PackageInstaller getPackageInstaller ();
PackageInstaller(Android 5.0以上)
从Android 5.0开始,PackageManager提供了基于Session的PackageInstaller类。
PackageInstaller类有4大组件,在后面的函数中都会用到,我们看一下它的结构:
PackageInstaller.SessionParams类
要创建Session,需要提供一个SessionParam对象。
SessionParams需要一个模式参数:
- MODE_FULL_INSTALL:新的apk会替换旧的apk的模式。
- MODE_INHERIT_EXISTING:新的apk继承旧的apk.
SessionParams有下面的方法可以设属性:
- setAppIcon:设置应用图标
- setAppLabel:设置应用标签
- setAppPackageName:设置应用包名
- setInstallLocation:是否支持外置设备
- setOriginatingUid:设置UID
- setOriginatingUri:设置下载的Uri
- setReferenceUri:设置一个可选的Uri
- setSize: 这个Session中的所用apk的总字节数
PackageInstaller.SessionInfo类
前一个SessionParams类都是set方法,这个SessionInfo类都是get方法
- getAppIcon
- getAppLabel
- getAppPackageName
- getInstallerPackageName
- getProcess
- getSessionId
- isActive
PackageInstaller.Session类
上面两个类,一个都是getter,另一个都是setter,终于轮到Session类出场了,它封装都是操作
- openRead:去读一个apk
- openWrite:去写一个apk
- fsync:将流写文件
- commit:提交
- close:关闭这个Session
- abandon:放弃这个Session
- getNames:列出都打开了哪些apk
- setStagingProgress:设置进度
事件类PackageInstaller.SessionCallback
事件方法:
- onActiveChanged
- onBadgingChanged
- onCreated
- onFinished
- onProgressChanged
Session的创建 - createSession
创建一个安装的Session. 一旦Session创建了,以后就可以继续用,重启之后仍然管用。
原型:
int createSession (PackageInstaller.SessionParams params);
参数:params,上面刚讲过的SessionParams
打开Session - openSession
createSession创建了之后,还得靠openSession去获取一个Session对象去进行操作。
原型:
PackageInstaller.Session openSession (int sessionId);
放弃一个Session - abandonSession
相当于调用Session的abandon方法。
原型:
void abandonSession (int sessionId);
注册与反注册callback
注册callback
注册一个SessionCallback以接受事件
原型:
void registerSessionCallback (PackageInstaller.SessionCallback callback);
void registerSessionCallback (PackageInstaller.SessionCallback callback, Handler handler);
反注册callback
反注册callback
原型:
void unregisterSessionCallback (PackageInstaller.SessionCallback callback);
获取Session信息
获取所有Installer的Session - getAllSessions
原型:
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());
}
}
获取当前程序的Session
原型:
List<PackageInstaller.SessionInfo> getMySessions ();
根据Session id获取SessionInfo
原型:
PackageInstaller.SessionInfo getSessionInfo (int sessionId);
uninstall
安装需要一个Session,删除就不用了,直接调这个就好。
原型:
void uninstall (String packageName,IntentSender statusReceiver);
更新SessionApp信息
更新app图标
void updateSessionAppIcon (int sessionId, Bitmap appIcon);
更新app标签
void updateSessionAppLabel (int sessionId, CharSequence appLabel);