Android應(yīng)用生死輪回的那些事兒(5) - 武器庫(3)- Installer相關(guān)工具
Install相關(guān)的API,在Android 1.0時一個也沒有聚至。全是后續(xù)陸續(xù)增加進來的。
我們來看看他們的歷史脆诉。
![pms_installer_gv](https://yqfile.alicdn.com/f80165d70751f80ac6d3ae8bdc36cf8123af6f3b.png)
我們發(fā)現(xiàn)贷币,除了4.2的是補充4.0的以外,基本上全是逢大版本才有更新:2.0偶摔,3.0字管,4.0信不,5.0都有新貨嘲叔。
Install相關(guān)的API發(fā)展史
Android 2.0新增的API - getInstallerPackageName
功能:獲取安裝器的名字抽活。
getter在Android 2.0出現(xiàn)了,但是setter要到Android 3.0才會出現(xiàn)丁逝。
原型:
String getInstallerPackageName (String packageName);
Android 3.0新增API - setInstallerPackageName
功能:設(shè)置安裝器的名字
原型:
void setInstallerPackageName (String targetPackage, String installerPackageName);
Android 4.0新增API - verifyPendingInstall
功能:監(jiān)聽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大組件,在后面的函數(shù)中都會用到丢间,我們看一下它的結(jié)構(gòu):
![pms_packager_installer_gv](https://yqfile.alicdn.com/25a93787a7c1e448c5149b4e9043083c6aa12b6d.png)
PackageInstaller.SessionParams類
要創(chuàng)建Session驹针,需要提供一個SessionParam對象。
SessionParams需要一個模式參數(shù):
- MODE_FULL_INSTALL:新的apk會替換舊的apk的模式柬甥。
- MODE_INHERIT_EXISTING:新的apk繼承舊的apk.
SessionParams有下面的方法可以設(shè)屬性:
- setAppIcon:設(shè)置應(yīng)用圖標(biāo)
- setAppLabel:設(shè)置應(yīng)用標(biāo)簽
- setAppPackageName:設(shè)置應(yīng)用包名
- setInstallLocation:是否支持外置設(shè)備
- setOriginatingUid:設(shè)置UID
- setOriginatingUri:設(shè)置下載的Uri
- setReferenceUri:設(shè)置一個可選的Uri
- setSize: 這個Session中的所用apk的總字節(jié)數(shù)
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:關(guān)閉這個Session
- abandon:放棄這個Session
- getNames:列出都打開了哪些apk
- setStagingProgress:設(shè)置進度
事件類PackageInstaller.SessionCallback
事件方法:
- onActiveChanged
- onBadgingChanged
- onCreated
- onFinished
- onProgressChanged
Session的創(chuàng)建 - createSession
創(chuàng)建一個安裝的Session. 一旦Session創(chuàng)建了漾肮,以后就可以繼續(xù)用,重啟之后仍然管用忱辅。
原型:
int createSession (PackageInstaller.SessionParams params);
參數(shù):params,上面剛講過的SessionParams
打開Session - openSession
createSession創(chuàng)建了之后墙懂,還得靠openSession去獲取一個Session對象去進行操作扮念。
原型:
PackageInstaller.Session openSession (int sessionId);
放棄一個Session - abandonSession
相當(dāng)于調(diào)用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());
}
}
獲取當(dāng)前程序的Session
原型:
List<PackageInstaller.SessionInfo> getMySessions ();
根據(jù)Session id獲取SessionInfo
原型:
PackageInstaller.SessionInfo getSessionInfo (int sessionId);
uninstall
安裝需要一個Session巧勤,刪除就不用了弄匕,直接調(diào)這個就好。
原型:
void uninstall (String packageName,IntentSender statusReceiver);
更新SessionApp信息
更新app圖標(biāo)
void updateSessionAppIcon (int sessionId, Bitmap appIcon);
更新app標(biāo)簽
void updateSessionAppLabel (int sessionId, CharSequence appLabel);