Android从一个应用程序启动第三方应用app
需求场景:
在自己开发的应用程序里,有个跳转到其他应用的按钮,比如分享到“新浪微博”,当点击这个按钮时,先判断手机中是否有安装“新浪微博”这个程序,有则启动“新浪微博”客户端,否则从指定的URL地址进行下载。
简言之,开启其他应用,包名跳转。
1、从一个应用跳转到其他应用要获取什么信息?
need第三方应用的包名,以及下载链接。
2、如何判断本机是否已经安装了该第三方应用?
(1)首先得到该程序的包名;
别人的应用程序我怎么知道他的包名和类名?
- 通过adb里面看程序装的所有应用
- 写一个遍历程序,获取所有已安装的程序,把包名打印出来,新浪微博的包名中应该会带有sina字眼,如 com.sina.weibo
//获取已经安装apk列表List<PackageInfo> packList = context.getPackageManager().getInstalledPackages(0);
//获得包名PackageInfo.packageName
(2)然后通过PackageManager判断是否存在该包的程序 。
android的每一个apk的activity的包的名字都是唯一的,所以可以通过判断这个activity所在包的名字来判断是不是该Apk已经安装
例1:
//以twitter程序为例,假设twitter程序包名为“com.twitter.android”。这时候可用以下代码来判断是否被安装。
//QQ客户端的包名是"com.tencent.mobileqq"
PackageInfo packageInfo;//PackageInfo所在包为android.content.pm
try {packageInfo = this.getPackageManager().getPackageInfo("com.twitter.android", 0);
} catch (NameNotFoundException e) {packageInfo = null;e.printStackTrace();
}
if(packageInfo ==null){System.out.println("没有安装");
}else{System.out.println("已经安装");
}
例2:可以封装到方法里,操作一样,只是把包名作为参数传入,返回值为布尔类型
private boolean isPkgInstalled(String pkgName) {
PackageInfo packageInfo = null;
try { packageInfo = this.getPackageManager().getPackageInfo(pkgName, 0);
} catch (NameNotFoundException e) { packageInfo = null; e.printStackTrace();
}
if (packageInfo == null) { return false;
} else { return true;
}
3、怎么跳转?
通过隐式intent跳转
例3:PackageManager中有getLaunchIntentForPackage这个方法!
//String pkg代表包名,String download代表下载urlfinal PackageManager pm = context.getPackageManager();Intent intent = pm.getLaunchIntentForPackage(pkg);if (null == intent) {//没有获取到intentif (!TextUtils.isEmpty(downoad)) {//跳转到下载第三方应用界面context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(downoad)));}} else {context.startActivity(intent);}
例4:在我们自己的程序中调用其他程序时往往要检查手机有没有安装该软件后再做相应操作,如没有安装,用intent将用户引导至android market去下载该程序,如已安装则打开该程序,并传入参数和调用其功能。
//下面介绍怎么判断手机已安装某程序的方法:
private boolean isAvilible(Context context, String packageName){ final PackageManager packageManager = context.getPackageManager();//获取packagemanager List< packageInfo> pinfo = packageManager.getInstalledPackages(0);//获取所有已安装程序的包信息 List<String> pName = new ArrayList<String>();//用于存储所有已安装程序的包名 //从pinfo中将包名字逐一取出,压入pName list中 if(pinfo != null){ for(int i = 0; i < pinfo.size(); i++){ String pn = pinfo.get(i).packageName; pName.add(pn); } } return pName.contains(packageName);//判断pName中是否有目标程序的包名,有TRUE,没有FALSE
} //下面是调用该方法进行判断后的逻辑:
//已安装,打开程序,需传入参数包名:"com.skype.android.verizon"
if(isAvilible(this, "com.skype.android.verizon")){ Intent i = new Intent(); ComponentName cn = new ComponentName("com.skype.android.verizon", "com.skype.android.verizon.SkypeActivity"); i.setComponent(cn); startActivityForResult(i, RESULT_OK); }
//未安装,跳转至market下载该程序
else { Uri uri = Uri.parse("market://details?id=com.skype.android.verizon");//id为包名 Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); }
参考链接:http://www.eoeandroid.com/thread-152763-1-1.html?_dsign=2242c74c
4、跳转后呢?
如何在android应用程序中启动其他apk程序,被启动程序退出后返回之前的程序?
//你只需要在A中打开B,并为B设置 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//不做对A的关闭处理finish() 这样就可以了Intent intent=new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setComponent(new ComponentName(objAppClassName, mainActivity));
context.startActivity(intent);
例5:原始跳转方法,要包名和类名(通过ComponentName),后来可以只要包名…
Android 开发有时需要在一个应用中启动另一个应用,比如Launcher加载所有的已安装的程序的列表,当点击图标时可以启动另一个应用。
一般我们知道了另一个应用的包名和MainActivity的名字之后便可以直接通过如下代码来启动:
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = new ComponentName(packageName, className);
intent.setComponent(cn);
startActivity(intent);
但是更多的时候,我们一般都不知道应用程序的启动Activity的类名,而只知道包名,我们可以通过ResolveInfo类来取得启动Acitivty的类名。
下面是实现代码:
private void openApp(String packageName) {PackageInfo pi = getPackageManager().getPackageInfo(packageName, 0);Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);resolveIntent.setPackage(pi.packageName);List<ResolveInfo> apps = pm.queryIntentActivities(resolveIntent, 0);ResolveInfo ri = apps.iterator().next();if (ri != null ) {String packageName = ri.activityInfo.packageName;String className = ri.activityInfo.name;Intent intent = new Intent(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_LAUNCHER);ComponentName cn = new ComponentName(packageName, className);intent.setComponent(cn);startActivity(intent);}
}
5、别人是怎么做的,如:
微信是如何判断本机是否有安装某个第三方 App 的?
通过系统提供的getPackageManager()函数获得PackageManager对象,而PackageManager中提供了getInstalledPackages()函数可以获得已经安装的应用程序包,它会返回一个所有已经安装的应用程序的列表。
安卓中能否使用浏览器判断一个应用是否安装?
Launch custom android application from android browser
Android从一个应用程序启动第三方应用app相关推荐
- 如何从Android中的另一个应用程序启动活动
我想从我的Android应用程序启动已安装的软件包. 我认为可以使用意图,但是我没有找到一种方法. 有链接,在哪里可以找到信息? #1楼 我知道已经回答了,但是这是我实现类似内容的方法: Intent ...
- 通过Android系统日志监听程序启动事件
经常有这样的需求:在程序A启动之后,在这个程序上覆盖一个界面,让用户输入密码后才能启动程序A,这类场景主要集中在安全软件中. 那应该怎样得知某某程序启动了,系统没有相应的广播,这很难知道程序启动了. ...
- 一个java程序启动后至少有几个线程?他们的作用是什么?_java笔记录(三、多线程)...
1.进程和线程: 进程:正在进行的程序.每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元. 线程:进程内部的一条执行路径或者一个控制单元. 两者的区别: 一个进程至少有一个线程 ...
- iOS开发UI篇 程序启动原理和UIApplication
2019独角兽企业重金招聘Python工程师标准>>> 一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplicati ...
- iOS程序启动原理(上)
为什么80%的码农都做不了架构师?>>> iOS程序启动原理 Info.plist 常见设置 建立一个工程后,会在Supporting files文件夹下看到一个"工 ...
- iOS开发 - App程序启动原理
Info.plist和pch文件的作用 建立一个project后,会在Supporting files目录下看到一个"project名-Info.plist"的文件,该文件对pro ...
- Delta3d框架学习--程序启动过程详解
一个Delta3d程序启动过程详解 一.初始化一个dtGame::GameApplication的实例,dtGame::GameApplication* app = new dtGame::GameA ...
- 当上项目经理才知道!整理几个重要的Android知识,论程序员成长的正确姿势
前言 今天我给大家再次分享一下,我最近的一些读书的感想,思考起来,确实能够给自己带来一些真实的帮助和启发,希望大家在平时的工作学习中,也能够认清楚学习的一些本质. 如果我们的学习是在不断掌握应对具体工 ...
- 推荐一个程序员必备官方 App ,名字叫:力扣
[回复"1024",送你一个特别推送] 天真的很冷,冬天真的来了.就在刚刚我在淋着雨,回到了温暖的家中.对头,身在北方我们,家中有暖气,南方同学别羡慕哦!哈哈,是的,我们供暖了. ...
最新文章
- Ant Design 入门-参照官方文档使用组件
- PyTorch 源码解读之即时编译篇
- Mysql 的一些基本用法
- java获取vm运行参数_如何获取在Java中运行Java VM的版本?
- Spark一些组件的定义
- 面试官:你给我手写个RPC框架看看
- aix ntp 配置_aix下开启ntp服务
- 高级着色语言HLSL入门(1)
- CST,CET,UTC,GMT,DST,Unix时间戳几种常见时间概述与关系(转)
- python os模块安装方法_Python模块——os模块详解
- 支持alpha通道的视频编码格式以及容器类型汇总
- 看完这份全国各地结婚/离婚数据,我彻底懵了。。。
- 矩阵标准型的系数是特征值吗_矩阵分解术,不得不从高斯说起
- 固定效应模型VS随机效应模型
- 用计算机按余弦,知道余弦的值怎么用计算器求度数
- 登录失败 12306服务器不稳定,12306显示登陆失败43003怎么办-12306登录显示43003含义详解...
- 串扰(crosstalk)
- Spark 图计算实战
- HDU -1704 Rank——floyd
- Effie 与文字讲缘分,与写作者交朋友