Android中怎样在应用A中启动或安装应用B
看到别人做的游戏攻略,想着自己的游戏攻略也加入新的功能,即Android中怎样在应用A中启动或安装应用B。就查了一些资料整理下来.
启动或安装对应的应用的方法:
Step1:推断是否安装目标应用。仅仅要知道目标应用的安装包名就能够通过推断"/data/data/packagename"是否存在来实现。
/**
* 推断是否安装目标应用
* @param packageName 目标应用安装后的包名
* @return 是否已安装目标应用
* @author zuolongsnail
*/
private boolean isInstallByread(String packageName) {
return new File("/data/data/" + packageName).exists();
}
Step2:目标应用已安装则启动。否则先安装。
/**
* 先推断是否安装。已安装则启动目标应用程序,否则先安装
* @param packageName 目标应用安装后的包名
* @param appPath 目标应用apk安装文件所在的路径
* @author zuolongsnail
*/
private void launchApp(String packageName, String appPath) {
// 启动目标应用
if (isInstallByread(packageName)) {
// 获取目标应用安装包的Intent
Intent intent = getPackageManager().getLaunchIntentForPackage(
packageName);
startActivity(intent);
}
// 安装目标应用
else {
Intent intent = new Intent();
// 设置目标应用安装包路径
intent.setDataAndType(Uri.fromFile(new File(appPath)),
"application/vnd.android.package-archive");
startActivity(intent);
}
}
推断应用是否安装或者是否为最新版本号
在我们安装应用的时候有时须要检查应用是否安装,未安装则安装。旧版本号则覆盖安装。
/** 推断是否安装或覆盖安装的类型*/
private static final int NOTINSTALL = 0; // 未安装
private static final int INSTALLED = 1; // 已安装且为新版本号
private static final int OLDVERSION = 2; // 已安装但为旧版本号
/**
* 推断应用是否安装或者是否为最新版本号
* @param packageName 目标应用安装后的包名
* @param versionCode 指定的应用版本
* @return 安装的类型
* @author zuolongsnail
*/
private int isInstallByread(String packageName, int versionCode){
// 推断是否安装
if(new File("/data/data/" + packageName).exists()){
// 获取系统中安装的全部应用包名集合
List<PackageInfo> packages = getPackageManager().getInstalledPackages(0);
for(int i=0;i<packages.size();i++){
PackageInfo packageInfo = packages.get(i);
// 找出指定的应用
if(packageName.equals(packageInfo.packageName)){
if(packageInfo.versionCode >= versionCode){
return INSTALLED;
}else{
return OLDVERSION;
}
}
}
}
return NOTINSTALL;
}
上面程序中的versionCode是在Manifest.xml文件里的Manifest标签中配置的,表示应用的版本。
Android中怎样在应用A中启动或安装应用B的更多相关文章
- Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 8 (转)
Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 8http://www.crifan.com/android_emulator_ ...
- 【已解决】Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 8
[问题] 折腾: [已解决]Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 8 过程中,增大对应AVD的内存为2G后,结果无法启 ...
- 【已解决】Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory
[已解决]Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 结论是: 当前有个bug: 默认是通过 hw.ramSize=1024 ...
- [Android]ListView的Adapter.getView()方法中延迟加载图片的优化
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4139998.html 举个例子吧,以好友列表为例 ListVi ...
- Android开发面试经——4.常见Android进阶笔试题(更新中...)
Android开发(29) 版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http:/ ...
- Android总结篇系列:Activity中几个主要函数详解
Activity作为Android系统中四大基本组件之一,包含大量的与其他的各大组件.intent.widget以及系统各项服务等之间的交互的函数.在此,本文主要选取实际项目开发中常用的,但完全理解又 ...
- Android插件化的兼容性(中):Android P的适配
Android系统的每次版本升级,都会对原有代码进行重构,这就为插件化带来了麻烦. Android P对插件化的影响,主要体现在两方面,一是它重构了H类中Activity相关的逻辑,另一个是它重构了I ...
- Android Application中的Context和Activity中的Context的异同
一.Context是什么: 1.Context是维持Android程序中各组件能够正常工作的一个核心功能类,我们选中Context类 ,按下快捷键F4,右边就会出现一个Context类的继承结构图啦, ...
- android 编程小技巧(持续中)
first: Intent跳转一般存用于Activity类,可是若要在非activity类里跳转的话,解决方法是在startActivity(intent)前加mContext即上下文,终于为 ...
随机推荐
- MSSQL - 存储过程Return返回值
1.存储过程中不使用外部参数. 存储过程: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ========================== ...
- 点击得到QTableWidget中任意位置QPushButton的行列信息
http://www.qtcn.org/bbs/read-htm-tid-51835.html http://www.qtcn.org/bbs/simple/?t43841.html 比如(点击每行最 ...
- 九度OnlineJudge之1020:最小长方形
题目描述: 给定一系列2维平面点的坐标(x, y),其中x和y均为整数,要求用一个最小的长方形框将所有点框在内.长方形框的边分别平行于x和y坐标轴,点落在边上也算是被框在内. 输入: ...
- MapReduce整体架构分析
继前段时间分析Redis源代码一段时间之后.我即将開始接下来的一段技术学习的征程.研究的技术就是当前很火热的Hadoop,可是一个Hadoop生态圈是很庞大的.所以首先我的打算是挑选当中的一部分模块, ...
- Tomcat 用户配置
如果你没有改变任何配置文件,请检查文件conf / tomcat用户.xml在你安装.该文件必须包含凭证让你使用这个应用. 例如,添加一个用户名为tomcat manager gui角色s3cret密 ...
- CDialogBar(对话条)和CReBar(伸缩条)的编程
对话条是工具栏和无模式对话框相结合的产物,对话条和对话框类似,包含有标准的Windows控件,并且可以通过创建对话框模板来表示对话条. 伸缩条功能很强大,我们可以在伸缩条中直接增加CToolBar,C ...
- 一劳永逸解决UAC问题(修改QMAKE_LFLAGS_EXE的设置)
如果你的程序跑在一个开启了UAC保护的系统中,而你的程序又没有"盾牌"的话,程序总是会受到各种阻挠的,比如读写文件,写注册表等. 有了"盾牌"的话就不会出现一些 ...
- AngularJs 父子级Controller传递数据
<div ng-controller="MyAccountCtrl"> <div ng-controller="TransferCtrl"&g ...
- 如何关闭android studio开发环境自动保存
使用DW习惯了现在转到学习开发android,请问怎样关闭android studio的自动保存功能,然后按ctrl+s进行保存,因为有时候代码不想让其保存,他也自动保存了. File -> S ...
- html5实现拖拽文件上传
以下是自学it网--中级班上课笔记 网址:www.zixue.it html文件 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict ...