你的第一个赌注是看看Android的本机
PackageInstaller.我建议修改该应用程序的方式你喜欢,或只是提取所需的功能。
具体来说,如果你看一下PackageInstallerActivity及其方法onClickListener:
public void onClick(View v) {
if(v == mOk) {
// Start subactivity to actually install the application
Intent newIntent = new Intent();
...
newIntent.setClass(this, InstallAppProgress.class);
...
startActivity(newIntent);
finish();
} else if(v == mCancel) {
// Cancel and finish
finish();
}
}
然后你会注意到实际的安装程序位于InstallAppProgress类。检查该类,你会发现initView是核心安装程序功能,最后一件事是调用PackageManager的installPackage函数:
public void initView() {
...
pm.installPackage(mPackageURI, observer, installFlags, installerPackageName);
}
下一步是检查PackageManager,这是抽象类。你会发现installPackage(…)函数。坏消息是它用@hide标记。这意味着它不是直接可用(您将无法通过调用此方法来编译)。
/**
* @hide
* ....
*/
public abstract void installPackage(Uri packageURI,
IPackageInstallObserver observer,
int flags,String installerPackageName);
但是你将能够通过反射来访问这个方法。
如果你对PackageManager的installPackage函数如何实现感兴趣,看看PackageManagerService。
概要
你需要通过Context的getPackageManager()获取包管理器对象。然后你将通过反射调用installPackage函数。