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><dataandroid: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);
如果不添加这个启动模式,有时候返回顺序是混乱的:

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

  1. php跳转到另外一个方法,PHP 页面跳转到另一个页面的多种方法方法总结

    PHP 页面跳转到另一个页面的多种方法方法总结 一用 HTTP 头信息 也就是用 PHP 的 HEADER 函数 PHP 里的 HEADER 函数的作用就是向浏览器发出由 HTTP 协议规定的本来应该 ...

  2. jquery mobile 从一个html的page跳转到另一个html的page

    <a href="second.html#page"  rel="external">

  3. android 7.0 黑屏,Android app启动是出现白屏或者黑屏如何解决?

    1.为什么 APP 启动时会出现白屏或者黑屏? 当打开一个 Activity 时,如果这个 Activity 所属的应用还没有在运行,系统会为这个 Activity 所属的应用创建一个进程,但进程的创 ...

  4. Android APP启动时出现白屏或者黑屏怎么办?

    1.为什么APP启动时会出现白屏或者黑屏? 当打开一个Activity时,如果这个Activity所属的应用还没有在运行,系统会为这个Activity所属的应用创建一个进程,但进程的创建与初始化都需要 ...

  5. android应用启动次数,应用统计: APP启动次数,软件用时统计,用量提醒

    编辑点评 让偷玩手机的孩子无所遁形 应用统计: APP启动次数,软件用时统计,用量提醒 介绍 应用统计: APP启动次数,软件用时统计,用量提醒 应用统计又称屏幕时间,用量分析,时间管理,是一个记录用 ...

  6. 【SemiDrive源码分析】【X9芯片启动流程】30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析(一)

    [SemiDrive源码分析][X9芯片启动流程]30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析(一) 一.Android Kernel 启动流程分析 ...

  7. Android应用启动之从Launcher拉起APP(三)

    image.png 目录 Android应用启动之从Launcher拉起APP(一)Android应用启动之从Launcher拉起APP(二)Android应用启动之从Launcher拉起APP(三) ...

  8. Android应用启动之从Launcher拉起APP(二)

    image.png 目录 Android应用启动之从Launcher拉起APP(一)Android应用启动之从Launcher拉起APP(二)Android应用启动之从Launcher拉起APP(三) ...

  9. java开发app启动跳转到一个广告,Android实现点击通知栏后,先启动应用再打开目标Activity...

    情况简述 在开发Android app的过程中,遇到这样一个需求:app中启动一个Service,该Service在独立进程中运行,与服务器保持长连接,将服务器推送过来的消息在通知栏中显示,并设置点击 ...

  10. Android手机app启动的时候第一个Activity必须是MainActivity吗

    Android手机APP启动的第一个Activity是可以自己设置的,不是必须的MainActivity,可以是任何的Activity. 设置Android手机APP启动的第一个Activity得看A ...

最新文章

  1. 百万并发中间件系统的内核设计看Java并发性能优化
  2. Effect Java 学习笔记-对象的创建与销毁
  3. mysql中rpl_MySQL管理工具MySQL Utilities — mysqlrplcheck(44)
  4. Matplotlib图例中文乱码
  5. C/C++语言堆栈指引
  6. [翻译]ElasticSearch官方文档-安装
  7. 响应式网页设计代码_消除响应式网站建设设计中的缺陷
  8. myabtis 数字+逗号 传参问题 $和#
  9. Java基础学习总结(115)——Java 类加载机制详解
  10. 浅谈计算机教学论文,浅谈计算机在教学中的作用_优秀论文
  11. pat编程语言_浙江大学在线pat题库集合
  12. python软件下载百度云-python电子书学习资料打包分享百度云资源下载
  13. Linux7.2虚拟机连接电脑相关配置
  14. webserver技术总结之一:webserver概念
  15. 基于变步长扰动观察法的最大功率点跟踪
  16. js实现代码高亮显示
  17. 2019 11月 月末总结
  18. 接入翼支付的php,翼支付-天翼账号开放平台
  19. IP地址规划设计实验
  20. 你应该会喜欢的5个自定义 Hook

热门文章

  1. PHP 开发新版个人博客
  2. matlab二项式分布,C++ binomial_distribution二项式分布随机数用法解析
  3. PHP分片上传文件到又拍云对象存储
  4. stm32---ADXL345
  5. mysql 格林时间转换_oracle中将格林威治时间转化为一般时间
  6. 使用 Microsoft Symbol Server 获取调试符号文件
  7. 新服务器网卡识别及地址设置
  8. 用Vue做一个音乐app
  9. win10无线信号强度测试软件,WinFi Lite(WIFI分析工具) V1.0.15.0 官方版
  10. 《Visual C++数字图像模式识别技术详解(第2版)》一2.2 Visual C++数字图像处理