Android APP启动其他APP(一个APP拉起(跳转到)另一个APP)

1.需求

在开发中,作为程序员来说什么样子的需求没遇见过,一句话那就是什么需求都没问题(时间允许)。
最近在开发一个APP交互时,遇到这样的需求,1、自家APP拉起第三方的APP,并且传值,2、第三方APP拉起咱们的APP,并且根据传递过来的值启动相对应的页面。
Android开发一般页面分为启动页(SplashActivity)、引导页(GuideActivity)、活动闪屏页(ScreenActivity)、主页(MainActivity)、登录页(LoginActivity)等以及其他页面。
Android开发主页(MainActivity)的启动模式一般设置为:android:launchMode=“singleTask”,只有设置了这种启动模式才能更好的避免重复的启动主页面以及退出页面顺序异常的问题。

2.实现过程

先说下基本过程,A应用拉起B应用,从上面的实现方法某一个都可以实现,但是如果是A应用拉起B应用中的某个界面,但不是主页面,这时点击返回,直接跳出B应用来到A应用,很突然,对用户体验会有一定的影响。
正确的实现过程,首先判断被拉起的B应用是否处于后台运行。1、没有处于后台运行,A应用正常拉起B应用的主界面,然后再通过A应用传递type值,再跳转到对应的B界面。这时返回的顺序是B(type对应的界面)—>B应用的主界面—>A应用的界面;2、处于后台运行,说明B应用已经被打开,处于后台运行模式,这时我们不可以走B应用启动主界面的逻辑了,如果执意要这样做,由于我们设置了主页的启动模式为android:launchMode=“singleTask”,那么在B应用栈中位于B应用主界面以上的界面全部都会出栈,我们设置主界面的启动模式为singleTask是为了更好的避免重复的启动主页面以及退出页面顺序异常的问题。所以我们可以直接启动Activity的管理工具类,在启动页获取栈顶的Activity,然后在栈顶的Activity的基础上启动type对应的界面,这时返回的顺序是B(type)对应的界面—>B应用之前打开的界面—>B应用的主界面—>A应用的界面。

3.实现的方法

我们通过Intent的隐式启动来拉起。
隐式启动拉起第三方APP有三种方式:1、Package;2、Action;3、Uri(推荐)。

  • 首先判断我们拉起(跳转)的第三方APP是否存在
    public static boolean isApkInstalled(Context context, String packageName) {
            if (TextUtils.isEmpty(packageName)) {
                return false;
            }
            try {
                ApplicationInfo info = context.getPackageManager().getApplicationInfo(packageName, PackageManager.GET_UNINSTALLED_PACKAGES);
                return true;
            } catch (NameNotFoundException e) {
                e.printStackTrace();
                return false;
            }
        }
  • 不存在APP则让它跳转到应用商店
  /**
   * 启动到应用商店app详情界面
   *
   * @param appPkg    目标App的包名
   * @param marketPkg 应用商店包名
   */
   public void launchAppDetail(String appPkg, String marketPkg) {
      try {
          if (TextUtils.isEmpty(appPkg)) return;
          Uri uri = Uri.parse("market://details?id=" + appPkg);
          Intent intent = new Intent(Intent.ACTION_VIEW, uri);
          if (!TextUtils.isEmpty(marketPkg)) {
              intent.setPackage(marketPkg);
          }
          intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
          startActivity(intent);
      } catch (Exception e) {
          e.printStackTrace();
      }
  }
  • 第一种方法包名拉起 ,关于B应用的处理方法,有Demo可以参考
//A应用直接拉起B应用
Intent intent = getPackageManager().getLaunchIntentForPackage("B应用包名");
                if (intent != null) {
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                }
//拉起B应用的某个界面,我们可以传一个type值;当然如果知道你要跳转的Activity的类名
也可以这样写。
					Intent intent = new Intent();
                 	intent.setClassName("B应用包名", "B应用包名.Activity");
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
  • Action方式,需要在被拉起的B应用清单文件中启动页Activity添加以下配置
//需要注意的不要在原来的基础上添加 
<!--ACTION启动配置-->
            <intent-filter>
                <action android:name="SHIQJ" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
A应用
                    Intent intent = new Intent();
                    intent.setAction("SHIQJ");//这个值一定要和B应用的action一致,否则会报错
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
  • URI方式拉起 B应用清单文件需要配置:
    在启动页(SplashActivity)清单文件增加如下配置:注意:不要在原有的intent-filter中增加代码,而是在原有intent-filter下方再增加一个intent-filter。
            <intent-filter>
                <data
                    android:host="B应用包名最好"
                    android:path="/shiqj"
                    android:scheme="shiqj" />
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
            </intent-filter>
					Intent intent = new Intent();
                    Uri uri = Uri.parse("scheme://host/path");
                    intent.putExtra("", "");//这里Intent当然也可传递参数,但是一般情况下都会放到上面的URI中进行传递也就是"scheme://host/path?xx=xx"
                    intent.setData(uri);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);

切记:A应用拉起B应用的时候千万不要忘记添加:intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
如果不添加这个启动模式,有时候返回顺序是混乱的:

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值