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代表下载url
    final PackageManager pm = context.getPackageManager();
    Intent intent = pm.getLaunchIntentForPackage(pkg);
    if (null == intent) {//没有获取到intent
        if (!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

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值