Android应用生死轮回的那些事儿(5) - 武器库(3)- Installer相关工具

    xiaoxiao2026-08-19  6

    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:设置UIDsetOriginatingUri:设置下载的UrisetReferenceUri:设置一个可选的UrisetSize: 这个Session中的所用apk的总字节数

    PackageInstaller.SessionInfo类

    前一个SessionParams类都是set方法,这个SessionInfo类都是get方法

    getAppIcongetAppLabelgetAppPackageNamegetInstallerPackageNamegetProcessgetSessionIdisActive

    PackageInstaller.Session类

    上面两个类,一个都是getter,另一个都是setter,终于轮到Session类出场了,它封装都是操作

    openRead:去读一个apkopenWrite:去写一个apkfsync:将流写文件commit:提交close:关闭这个Sessionabandon:放弃这个SessiongetNames:列出都打开了哪些apksetStagingProgress:设置进度

    事件类PackageInstaller.SessionCallback

    事件方法:

    onActiveChangedonBadgingChangedonCreatedonFinishedonProgressChanged

    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);
    转载请注明原文地址: https://ju.6miu.com/read-1311333.html
    最新回复(0)