老了,老了,那天有位小同事问我Android跳转三方应用时有什么要注意的?是否可以直接跳?如何传递参数过去? 嗯… 我竟然说需要root或者三方授权,尴尬了…

其实Android的四大组件都支持IPC通信,其中Activity的IPC通信方式,主要体现在Intent、Binder方面,我们常常可以看到通过activity启动各种系统功能,应用等;

其实在此之前已经有很多优秀的blog进行了总结,不过各有不同,我仅以我的方式记录一下 …

  • 如何跳转三方应用?
    • 跳转三方应用
    • 跳转三方应用 + 指定页面(Activity)
  • 如何获取手机上已有的app包名与启动页(Activity)?
    • 获取手机中安装的app包名、启动Activity
    • 获取手机app列表
    • 兴趣分析
  • 如何携带数据实现进程间(IPC)通信?
    • 进程通信
  • 如何获取手机上的应用商店?
  • 如何判断手机上是否存在某个app?

如何跳转三方应用?

这里指的三方应用可以理解为自身外的其余app,例如QQ、微信、支付宝、淘宝等app ~

主要通过 Activity Intent + PackageManager启动三方App,主要在于getLaunchIntentForPackage方法,如果理解通过Launch启动App的话,秒懂 ~

跳转三方应用

核心代码

    PackageManager packageManager = this.getPackageManager();Intent intent = packageManager.getLaunchIntentForPackage("项目包名");startActivity(intent);

封装方法

    /*** @param context     上下文* @param packageName 包名*/public void skipOtherApp(Context context, String packageName) {PackageManager packageManager = context.getPackageManager();Intent intent = packageManager.getLaunchIntentForPackage(packageName);startActivity(intent);}
跳转三方应用 + 指定页面(Activity)

跳转三方应用的具体界面与上方方式稍有不同,主要通过ComponentName类来帮助打开另一个应用的Activity或者Service等,具体通过Intent.setComponent方法实现。

核心代码

    Intent intent = new Intent();//这里跳转的是淘宝的启动页ComponentName comp = new ComponentName("com.taobao.taobao", "com.taobao.tao.welcome.Welcome");intent.setComponent(comp);//为三方的activity新开任务栈intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);

方法封装

    /*** @param packageName   包名* @param activityClass 跳转界面的activity*/public void skipOtherAppActivity(String packageName, String activityClass) {Intent intent = new Intent();//ComponentName类主要是用来帮助打开另一个应用的Activity或者Service等,通过Intent.setComponent方法实现ComponentName comp = new ComponentName(packageName, activityClass);intent.setComponent(comp);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);}

如何获取手机上已有的app包名与启动页(Activity)?

获取手机中安装的app包名、启动Activity
    /*** 通过PackageManager获取手机内所有app的包名和启动页(首个启动Activity的类名)* 可根据自己业务需求封装方法的返回体,可以是单app信息,也可以是appList*/public void getAllApp(Context context) {Intent intent = new Intent(Intent.ACTION_MAIN, null);intent.addCategory(Intent.CATEGORY_LAUNCHER);PackageManager packageManager = context.getPackageManager();List<ResolveInfo> appsInfo = packageManager.queryIntentActivities(intent, 0);Collections.sort(appsInfo, new ResolveInfo.DisplayNameComparator(packageManager));for (ResolveInfo info : appsInfo) {String pkg = info.activityInfo.packageName;String cls = info.activityInfo.name;Log.e("app_info", "pkg:" + pkg + " —— cls:" + cls);}}

查询效果

获取手机app列表

方法封装(或许有点画蛇添足了,就当做下次copy元素吧)

    /*** 获取手机app列表*/public List<ResolveInfo> getAllAppList(Context context) {Intent intent = new Intent(Intent.ACTION_MAIN, null);intent.addCategory(Intent.CATEGORY_LAUNCHER);PackageManager packageManager = context.getPackageManager();List<ResolveInfo> appsInfo = packageManager.queryIntentActivities(intent, 0);Collections.sort(appsInfo, new ResolveInfo.DisplayNameComparator(packageManager));return appsInfo;}
兴趣分析

看图说话可以分析出,主要是通过PackageManagerCategory为条件,过滤出android.intent.category.LAUNCHER的 app

看看ResolveInfo

看看ActivityInfo(我没去找线上源码,本地也没下载… 所以看不全)

关于每个app的基本信息,一般都在ActivityInfo中,有兴趣的可以去源码文档看一下 ~

如何携带数据实现进程间(IPC)通信?

在Android中Activity跨进程通信主要用到的是Binder机制,因为其内核空间是支持信息存储、传递的,有兴趣的话可以去学习一下Binder机制哈 ~

进程通信

既然说是俩个进程间通信,以下代码示例主要说明的是Aapp和Bapp通信的核心代码,此处也仅传递了一个字符串,如需传了大量数据自行扩展一下~(为了优化,可以在跳转前判断需跳转的app是否存在)

Aapp(作为数据发送端,也是数据的生产者)

    /*** 数据发送端(关于跳转的app,这里是通过异常进行判断,也可以通过方法进行判断,具体方法往后看)*/void sendClint(Context context) {try {ComponentName componentName = new ComponentName("跳转包名", "跳转类名");Intent intent = new Intent();Bundle bundle = new Bundle();bundle.putString("data", "我就是Aapp跳转过来的");intent.putExtras(bundle);intent.setComponent(componentName);startActivity(intent);} catch (ActivityNotFoundException e) {//判断是否安装B应用,提供下载提示Toast.makeText(context, "跳转包名(app)不存在,请及时下载", Toast.LENGTH_LONG).show();e.printStackTrace();}}

Bapp(作为数据接收端,也是数据的消费者)

    /*** 数据接收端()*/void acceptClint() {Intent intent = getIntent();String data = intent.getStringExtra("data");}

如何获取手机上的应用商店?

关于这部分主要借鉴了这儿,具体原理他文内也已经讲明白了,有兴趣的可以去看看

    /*** 获取当前手机上的应用商店数量** @param context*/public static ArrayList<String> getInstalledMarketPkgs(Context context) {ArrayList<String> pkgs = new ArrayList<>();if (context == null)return pkgs;Intent intent = new Intent();intent.setAction("android.intent.action.VIEW");intent.addCategory(Intent.CATEGORY_DEFAULT);intent.setData(Uri.parse("market://details?id="));PackageManager pm = context.getPackageManager();// 通过queryIntentActivities获取ResolveInfo对象List<ResolveInfo> infos = pm.queryIntentActivities(intent, 0);if (infos == null || infos.size() == 0) return pkgs;int size = infos.size();for (int i = 0; i < size; i++) {String pkgName = "";try {ActivityInfo activityInfo = infos.get(i).activityInfo;pkgName = activityInfo.packageName;} catch (Exception e) {e.printStackTrace();}if (!TextUtils.isEmpty(pkgName))pkgs.add(pkgName);}return pkgs;}

获取结果,一般以market结尾的包名,即为app的应用商店包名

如何判断手机上是否存在某个app?

    /*** 判断软件是否存在(应用市场本质也是app)*/public static boolean isExist(Context context, String packageName) {try {context.getPackageManager().getPackageInfo(packageName, 0);return true;} catch (PackageManager.NameNotFoundException e) {return false;}}

Android进阶之路 - 如何携带数据跳转到三方应用、指定页?相关推荐

  1. Android进阶之路 - 存、取、读 本地 Json 文件

    最近在开发中又开始加载一些本地的json数据源,回头看之前竟然没记录,赶紧记录一波 ~ 如何准备一个合格的json文件? AndoridStudio中如何存放json文件? 如何读取本地Json文件数 ...

  2. Android进阶之路 - 解决部分手机拍照之后图片被旋转的问题

    这几天犯了一个错误,初期想着甩锅给后台的- 但还好及时发现了是自身的问题~ 关联文章 Android基础进阶 - 调用拍照.获取图片(基础) Android基础进阶 - 获取.调用相册内图片(基础) ...

  3. Android进阶之路 - 批量下载、缓存图片、视频

    之前已经记录过,批量下载图片和缓存本地的方式,此篇主要记录批量下载图片.视频,同时缓存在本地的功能实现 关联篇 Android进阶之路 - 批量下载.缓存图片 Android进阶之路 - 批量下载.缓 ...

  4. Android进阶之路 - 批量下载、缓存图片

    在日常项目开发中,关于图片批量下载,数据缓存的相关功能比比皆是,这次也是去年在项目中需要在本地缓存商品数据,所以用到了批量下载的功能,特此记录 ~ 关联篇 Android进阶之路 - 批量下载.缓存图 ...

  5. Android进阶之路 - 软键盘中右下角的设置与监听

    在项目中,多多少少会遇到修改软键盘右下角按钮的需求,虽然已经写过几次,但是还是觉得在这里专心做个笔记比较放心 ~ 我的那些软键盘Blog ~ Android进阶之路 - 常见软键盘操作行为 Andro ...

  6. Android进阶之路 - 跳转应用商店下载、更新app

    写项目时,遇到版本升级.更新功能的地方太多了~ 针对不同的需求方,有的在项目内实时下载安装,有的则直接跳转应用商店让用户自行下载 ~ 版本更新.升级方式 当前项目内进行版本升级,apk下载后替换升级包 ...

  7. 浅谈Android进阶之路

    原址 过去十年是移动互联网蓬勃发展的黄金期,相信每个人也都享受到了移动互联网红利,在此期间,移动互联网经历了曙光期.成长期.成熟期.现在来说已经进入饱和期.依然记得在 2010-2013 年期间,从事 ...

  8. Android 进阶之路(我的博客文章目录)

    原文地址:http://blog.csdn.net/u011240877 为了方便读者阅读以及自己回顾,总结写过的文章和一些想要写的文章目录如下: #1.Java Java 解惑:Comparable ...

  9. Android 进阶之路:ASM 修改字节码,这样学就对了!

    本文已授权个人公众号「鸿洋」原创发布. 恢复双休了,准备捡起来写博客这件事,会尝试写好每一篇博客,准备写一个「进阶之路」的系列,希望对你有用. 没错,看了很多 ASM 入门的文章,都感觉文章写的很轻松 ...

最新文章

  1. MySQL安装ODBC驱动出现126错误
  2. DataGridView的列宽设置
  3. 支持4k输出的linux开发板,Linux 5.12率先开始支持SiFive的RISC-V FU740开发板
  4. UNIX环境高级编程 第11章 线程
  5. Python之路-4
  6. Spring框架帮助文档目录
  7. nginx limit_req限速设置
  8. 关于SVN报错问题错误码E175002的解决方案
  9. postgresql中实现按周统计详解
  10. 如何面试大厂web前端?(沟通软技能总结)
  11. 计算机ck,CKplayer
  12. 火影忍者ol HTML5,火影忍者OL-官方网站-腾讯游戏
  13. 三端合一跨平台开发的深度剖析(值得学习)
  14. 怎么计算机求和错误的,《表格计算求和错误怎么办》 为什么EXCEL公式求和会有错误...
  15. 承前2021,启后2022
  16. InfiniBand架构和技术实战总结
  17. JS计算日期加天数后的日期(起始日期+有效天数=截至日期)
  18. 边际电价计算matlab,PJM节点边际电价计算方法和其应用.PDF
  19. 转-赵青-《剑侠情缘网络版》开发回顾
  20. VSTO | C#快速开发电子签章插件

热门文章

  1. 无约束优化和有约束优化原理
  2. css选择器优先级及权重计算
  3. 跨平台应用开发进阶(四十五)uni-app集成企微客服实战
  4. 我转行程序员的那一年(七)
  5. 2021_01_04
  6. 将电脑新建文本文档txt的默认编码从ANSI改为utf-8
  7. Ext2explore查看ext2/ext3/ext4 file
  8. Hbuilderx是html5,HBuilderX代码提示系统说明
  9. Flutter应用架构之BloC模式实践
  10. echart折线图连线不显示问题总结