可以看到对application/vnd.android.package-archive这个mime的处理,还有android.intent.action.INSTALL_PACKAGE这个action的处理。

在文件管理器中点击apk文件,或者发送以上intent-filter中对应的action,就会调用PackageInstaller。

1.只安装指定前缀包名的应用

我们可以在initiateInstall()这个函数中,通过包名对将要安装的应用进行管控,参考代码如下:

private void initiateInstall() {

String pkgName = mPkgInfo.packageName;

Log.v(“AZ”,"[initiateInstall]pkgName:" + pkgName);

if(pkgName.startsWith(“com.zms”)){

// Check if there is already a package on the device with this name

// but it has been renamed to something else.

String[] oldName = mPm.canonicalToCurrentPackageNames(new String[] { pkgName });

if (oldName != null && oldName.length > 0 && oldName[0] != null) {

pkgName = oldName[0];

mPkgInfo.packageName = pkgName;

mPkgInfo.applicationInfo.packageName = pkgName;

}

// Check if package is already installed. display confirmation dialog if replacing pkg

try {

// This is a little convoluted because we want to get all uninstalled

// apps, but this may include apps with just data, and if it is just

// data we still want to count it as “installed”.

mAppInfo = mPm.getApplicationInfo(pkgName,

PackageManager.GET_UNINSTALLED_PACKAGES);

if ((mAppInfo.flags&ApplicationInfo.FLAG_INSTALLED) == 0) {

mAppInfo = null;

}

} catch (NameNotFoundException e) {

mAppInfo = null;

}

mInstallFlowAnalytics.setReplace(mAppInfo != null);

mInstallFlowAnalytics.setSystemApp(

(mAppInfo != null) && ((mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0));

startInstallConfirm();

}else{

finish();

}

}

以上代码的效果就是,只安装包名以“com.zms”开头的应用。其他的不会出现安装界面,直接finish()。

2.PackageInstaller安装完某个应用,自动打开:

packages/apps/PackageInstaller/src/com/android/packageinstaller/InstallAppProgress.java

private Handler mHandler = new Handler() {

public void handleMessage(Message msg) {

switch (msg.what) {

case INSTALL_COMPLETE:

mInstallFlowAnalytics.setFlowFinishedWithPackageManagerResult(msg.arg1);

if (getIntent().getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false)) {

Intent result = new Intent();

result.putExtra(Intent.EXTRA_INSTALL_RESULT, msg.arg1);

setResult(msg.arg1 == PackageManager.INSTALL_SUCCEEDED

? Activity.RESULT_OK : Activity.RESULT_FIRST_USER,

result);

finish();

return;

}

// Update the status text

mProgressBar.setVisibility(View.INVISIBLE);

// Show the ok button

int centerTextLabel;

int centerExplanationLabel = -1;

LevelListDrawable centerTextDrawable = (LevelListDrawable) getResources()

.getDrawable(R.drawable.ic_result_status);

if (msg.arg1 == PackageManager.INSTALL_SUCCEEDED) {

mLaunchButton.setVisibility(View.VISIBLE);

centerTextDrawable.setLevel(0);

centerTextLabel = R.string.install_done;

// Enable or disable launch button

mLaunchIntent = getPackageManager().getLaunchIntentForPackage(

mAppInfo.packageName);

boolean enabled = false;

if(mLaunchIntent != null) {

List list = getPackageManager().

queryIntentActivities(mLaunchIntent, 0);

if (list != null && list.size() > 0) {

enabled = true;

}

if (enabled) {

// ZMS:Add for opening app automatically START

if(mAppInfo.packageName.equals(“com.zms.demo”)){

startActivity(mLaunchIntent);

}

// ZMS:END

mLaunchButton.setOnClickListener(InstallAppProgress.this);

} else {

mLaunchButton.setEnabled(false);

}

} else if (msg.arg1 == PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE){

/// M: [ALPS00269830][ICS-TDD][Symbio

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

][Free test] Assertion while playing music when downloading apks @{

Android PackageInstaller:安装应用的应用,从三流Android外包到秒杀阿里P7相关推荐

  1. 分享十次Android面试经验总结,已收字节,阿里,从三流Android外包到秒杀阿里P7,

    3.是不是任何线程都可以实例化Handler?有没有什么约束条件? 4.Looper.loop是一个死循环,拿不到需要处理的Message就会阻塞,那在UI线程中为什么不会导致ANR? 5.Handl ...

  2. Android PowerManager,从三流Android外包到秒杀阿里P7

    wakeLock.acquire(90 * 1000); } private void acquireWakeLock2() { if(wakeLock == null){ wakeLock = po ...

  3. 【Android Studio安装部署系列】八、Android Studio主题皮肤更换

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio具有自己的主题皮肤,但是如果想要更换自己喜欢的主题皮肤,可以参考下面的步骤. 注意,更换主题皮肤,之前的 ...

  4. 【Android Studio安装部署系列】十一、Android studio获取数字签名信息

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 下面介绍下调试版本和发布版本获取数字签名的方法,通过以下方法可以获取到SHA1和MD5. 一般在使用分享功能,在第三方平台中创建应用 ...

  5. 【Android Studio安装部署系列】十三、Android studio添加和删除Module 2

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 新建.导入.删除Module是常见的操作,这里简单介绍下. 新建Module File--New--New Module... 选中 ...

  6. 使用PackageInstaller安装app流程学习小结

    前言 首先本文不是做PackageManagerService学习总结,PackageManagerService这货有1万2千多行代码,学习起来颇费劲,并且这货功能强大,本文只会总结其中一个小小的功 ...

  7. 【Android Studio安装部署系列】目录

    概述 从刚开始使用Android Studio到现在,下面所有目录下的操作,当时习惯性的把每一个整理成一个文档(其实就是简单文字描述+截图):有些地方当时是一知半解,现在会稍微明白一些.正好赶上现在有 ...

  8. Android Studio安装并运行初始程序显示‘Hello World‘。

    文章目录 前言 一.Android Studio是什么? 二.安装步骤 1.打开Android Studio安装程序 2.配置并使用Android Studio 总结 前言 在安装使用android ...

  9. phoneGap3.0安装步骤(以windows下的android环境为例):

    环境: WIN系统,JDK,Android,Eclipse,Ant,Git,PhoneGap3.x (Cordova) 1. 安装JRE,设置JAVA_HOME,比如JAVA_HOME=C:\prog ...

  10. android 安装多个apk,Android apk 安装相关的几个目录

    一.几个关键目录 1./data/local/tmp /data/local/tmp 目录是转为android studio 安装应用程序保留的目录 android studio 安装apk时 首先将 ...

最新文章

  1. Mongodb 请求处理流程
  2. .Net 编码以及与这些编码关联的代码页
  3. Linux查看c语言组件进程,Linux下查看进程IO工具iopp
  4. 网上无意中看到的一句话。。。
  5. redhat 6.4 虚拟化平台搭建千万PV架构
  6. 大数据——Python数据爬取
  7. mysqlserver 下载安装
  8. 如何保障科技产品供应链的安全?
  9. 显示器接口_显示器接口都有哪些?
  10. 关于Android直接连MySQL获取数据的真机测试的一些坑
  11. 爬虫手册03 Selenium的使用
  12. 五分钟轻松搞定产品需求文档!这可能史上最全PRD文档模板
  13. ASP.NET Web Pages - 教程
  14. Windows 2016 服务器安全配置
  15. [GIS原理] 8 GIS基本空间分析-叠置分析|缓冲区分析|窗口分析
  16. 支付宝支付验证签名失败
  17. 曼哈顿算法公式_Manhattan Distance Calculation(曼哈顿距离算法)
  18. python中Try的运用及意义
  19. 从 .NET 开发人员的角度理解 Excel 对象模型--------结合上一篇 vb code excel 单元格锁定...
  20. CE-扫描扫雷中雷区地址

热门文章

  1. 实用工具软件远古大神Nir Sofer,数百款短小精悍便携工具,从Win2000到Win10通吃
  2. 跟大家分享一下牛人常用的资源(牛客网 )!
  3. win7科学计算机不支持,新CPU不支持Win7怎么回事?新一代主板装不了Win7的解决办法...
  4. Ubuntu20.04配置NTP服务器
  5. 手机计算机快速切换功能,群控系统快速切换多部手机
  6. 通过hx1838遥控数码管显示对应数字的程序及问题
  7. 图像处理的边缘和纹理的区别
  8. 根据经纬度求距离(算法)
  9. #define c# 报错_天轰穿C#教程之#define和#undef【原创】
  10. linux 内核 触摸屏,7. Linux - 触摸屏(电阻屏)驱动程序实现