安卓手记--No2:A app唤醒 B app

逻辑分析:
如果Bapp安装了,则拉起,并在指定的activity里面做特别处理
如果Bapp没有安装,则跳转到Bapp的应用市场

A app唤醒 B app

包名拉起

优点:简单易上手
缺点:会暴露包名,和Bapp的activity全名

  1. 首先修改B的配置文件AndroidManifest.xml,针对拉起的指定的Activity,加上下面这句话
    android:exported="true"
  2. 在Aapp里面编写代码
    String packname = "com.example.bapp"; // Bapp的包名
    String activity = "com.example.bapp.BappActivity"; // Bapp指定拉起的activity的全名
    
    public void openBapp() {
        Intent intent;
        PackageManager packageManager = getPackageManager();
        if (checkPackInfo(packname)) {
            intent = packageManager.getLaunchIntentForPackage(packname);
            ComponentName component = new ComponentName(packname, activity);
            intent.setComponent(component);
            intent.putExtra("fromOtherApp" , true);
            startActivity(intent);
        } else {
            Uri uri = Uri.parse("market://details?id=" + packname);
            intent = new Intent(Intent.ACTION_VIEW, uri);
            startActivity(intent);
        }
    }

    private boolean checkPackInfo(String packname) {
        PackageInfo packageInfo = null;
        try {
            packageInfo = getPackageManager().getPackageInfo(packname, 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return packageInfo != null;
    }
  1. 在Bapp的指定activity里面做处理,可以放在onResume里面,这样在拉起Bapp的时候一定会调用
   @Override
   public void onResume() {
       Intent intent = getIntent();
       if (null != intent){
           if(intent.getBooleanExtra("fromOtherApp", false)){
           		// 在这里写具体处理内容
           }
       }
   }

URI拉起

优点:未暴露Bapp的包名和activity的全名(下面的例子是为了拉起应用市场才暴露包名的,单纯拉起Bapp并未用到包名)
缺点:比较复杂,需要在配置文件里定义死了host,path,scheme

  1. 修改B的配置文件AndroidManifest.xml,针对拉起的指定的Activity,加上下面这句话
    android:exported="true"
  2. 修改B的配置文件AndroidManifest.xml,针对拉起的指定的Activity,加上下面这个标签

scheme最好定义成独一无二的,原因如下:
Aapp唤醒的时候不会询问用哪个APP打开,会直接打开Bapp

举个例子:
如果定义成https,那么Aapp在唤醒的时候,会弹出询问框,询问用哪个app打开
询问选项包括:Bapp,浏览器

    <intent-filter>
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
		
        <data
            android:host="bapp.example.com"
            android:path="/bapphome/"
            android:scheme="open_bapp" />
    </intent-filter>
  1. 在Bapp的指定activity里面做处理,可以放在onResume里面,这样在拉起Bapp的时候一定会调用
	// 配置文件里定义的内容
    public static final String SCANNER_INTENT_SCHEME = "open_bapp";
    public static final String SCANNER_INTENT_HOST = "bapp.example.com";
    public static final String SCANNER_INTENT_PATH = "/bapphome/";
    
    @Override
    public void onResume() {
        Intent intent = getIntent();
        if (null != intent){
	        Uri uriData = intent.getData();
	        if (uriData != null &&
	                SCANNER_INTENT_SCHEME.equalsIgnoreCase(uriData.getScheme()) &&
	                SCANNER_INTENT_HOST.equalsIgnoreCase(uriData.getHost()) &&
	                SCANNER_INTENT_PATH .equalsIgnoreCase(uriData.getPath())) {
	            // 在这里写具体处理内容
	        }
        }
    }
  1. 在Aapp里面编写代码
   String packname = "com.example.bapp";
   public void openBapp() {
       Intent intent;
       if (checkPackInfo(packname)) {
           intent = new Intent(Intent.ACTION_VIEW, Uri.parse("open_bapp://bapp.example.com/bapphome/"));
           intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 这句话一定要写,否则会在Aapp里面直接显示Bapp的内容,不会拉起新的Bapp
           startActivity(intent);
       } else {
           Uri uri = Uri.parse("market://details?id=" + packname);
           intent = new Intent(Intent.ACTION_VIEW, uri);
           startActivity(intent);
       }
   }

   private boolean checkPackInfo(String packname) {
       PackageInfo packageInfo = null;
       try {
           packageInfo = getPackageManager().getPackageInfo(packname, 0);
       } catch (PackageManager.NameNotFoundException e) {
           e.printStackTrace();
       }
       return packageInfo != null;
   }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值