先上效果图:

获取手机已安装的App列表利用Android系统API就可以办到,这里为什么要引入RxJava?现在我们假设一下有下面几个需求:

1、我们不需要所有的App,只需要用户安装的第三方App,即过滤到系统App;

2、我们自定义一个AppInfo类,该类中保存了App_Icon、App_Name、App_VersionName等属性,而Android系统提供的API我们之恩那个获取ApplicationInfo,这样就存在一个类型转换;

3、获取Application信息,过滤数据这些操作都是相对耗时的操作,我们需要在工作线程进行操作,获取数据后,我们又需要切换到UI线程进行结果的显示,这又涉及到线程的切换。

基于上面的需求,我们用传统的java代码来实现,相对来说比较麻烦,既然RxJava现在这么火,我们就利用RxJava来实现上面的几个需求。本文所涉及的RxJava操作符主要包括filter、map两个操作符。

一、定义一个AppInfo类,用来保存我们需要显示的信息



二、定义一个Adapter





三、显示页面

显示页面主要是一个RecyclerView列表,用来展示手机中已经安装的App列表。布局什么的就不多说了,直接上代码:



通过getInstalledApp方法,我们可以获取到系统的安装的应用的PackageInfo,在getAllApp刚发中,通过subscriber.onNext(info)发送PackageInfo;由于PackageInfo中包含了所有的App信息,而这并不是我们需要的,我们只需要用户安装的App就可以,这样就要求过滤掉系统App,RxJava提供了一个filter操作符来进行过滤操作,通过map操作我们就可以把系统应用过滤掉;另外,我们需要将获得的PackageInfo转换为我们定义的AppInfo类型,而RxJava只需要一个map操作符就能完成转换,这样就可以把获取的App信息保存到AppInfo类中。

通过上面的过滤和变换之后,我们就可以得到AppInfo,然后在onNext方法中通过mData.add(appInfo)把结果添加进List集合中,onCompleted方法中通知Adapter进行更新mAdapter.notifyDataSetChanged()。

看似复杂的一系列需求,得益于RxJava优秀API设计,使得数据的过滤、变换等操作变得十分简单,同时RxJava的流式API设计,即使我们的逻辑很复杂的情况下,RxJava能够依然保持我们代码逻辑的简洁和易懂。

利用RxJava获取手机已安装的App的图片、应用名称和版本号的更多相关文章

  1. 获取手机已安装应用的name,bundleIdentitifer

    获取手机已安装应用的name,bundleIdentitifer Class c =NSClassFromString(@"LSApplicationWorkspace"); id ...

  2. iOS11 获取手机已安装应用列表

    在iOS 11 以前我们可以使用LSApplicationWorkspace来获取手机上已安装的应用列表 iOS 11 上获取所有已安装应用接口被禁,但可以根据BundleId检查App是否存在 - ...

  3. 从”茄子快传”看应用程序怎样获取手机已安装程序的apk文件

    "茄子快传"是联想开发的一款近距离文件共享软件.它通过wifi-direct(速度飞快,不须要联网)或者普通的网络(速度慢)在不同手机间传递文件. 不知为何.它就火了起来,火的也飞 ...

  4. iOS获取已安装的app列表(私有库)+ 通过包名打开应用

    1.获取已安装的app列表 - (void)touss { Class lsawsc = objc_getClass("LSApplicationWorkspace"); NSOb ...

  5. 从Android手机中取出已安装的app包,导出apk

    从Android手机中取出已安装的app包,导出apk TAG:Android,提取,apk,adb,pm,root,导出apk 假设有这样一个场景,A君看到你手机上一个实用APP,想要安装到自己手机 ...

  6. android检测手机是否安装某个app

    public static boolean isAvilible(Context context, String packageName){ //获取packagemanager final Pack ...

  7. Android中获取系统上安装的APP信息

    Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:00000099 EndFragment:00003259 Android中获取系统上安装的APP信 ...

  8. 如何用js检测手机是否安装某个app

    问题描述 如果本地安装了app那么直接打开,否则苹果要跳转到app-store,安卓则要跳到对应的市场 解决方案 一 //html代码中 的 a 标签,以微信为例,默认的是调用weixin schem ...

  9. HTML中判断手机是否安装某APP,跳转或下载该应用

    有些时候在做前端输出的时候,需要和app的做些对接工作.就是在手机浏览器中下载某app时,能判断该用户是否安装了该应用.如果安装了该应用,就直接打开该应用:如果没有安装该应用,就下载该应用.那么下面就 ...

随机推荐

  1. CHARFORMAT2 structure

    CHARFORMAT2 structure 包含在丰富的编辑控件中的字符格式设置的信息.charformat2是微软丰富的编辑CHARFORMAT结构2扩展.微软丰富的编辑2允许您使用结构与em_ge ...

  2. C语言学习012:将代码文件分成多个文件

    如果将所有的代码都写到一个文件中,当对于小项目来说不会有什么问题,但是当它一个很大的工程的时候,如果将所有代码都写到一个文件中,不但开发起来很困难,维护更是头疼,所以我们应该将代码按不同的功能分别建立 ...

  3. Servlet生命周期中的service方法分析

    问题ServletLifeCycle中的service方法内,有super.service(request, response); 会执行this.doGet(HttpServletRequest r ...

  4. C#常用类库

    1.0 TimeSpan  TimeSpan passTime = (TimeSpan)(DateTime.Now - curUser.refuseTime); if (passTime.Days * ...

  5. VB.NET Winform的一些功能实现

    近段时间,开发的需要,需要写一个winform的程序.用VB.NET来写. 开发开始,需要实现一个窗体设为多文档界面 (MDI) 子窗体的容器.实现这个功能,开始找资料,得知设置一个属性:Form.I ...

  6. iOS阶段学习第一天笔记(Mac终端的操作)

    前言部分 原本从事的是.NET开发,一直在要不要转iOS 中犹豫徘徊,经过复杂的内心挣扎终于鼓起勇气辞职脱产学习iOS;希望通过四个月的 学习后能够拿到理想的薪资.以下是学习过程中的学习笔记,为了方便 ...

  7. 【Java每日一题】20161121

    package Nov2016.use01; class Test { public String getString(){ return "123"; } } package N ...

  8. How to Access MySQL with Python Version 3.4

    http://askubuntu.com/questions/630728/how-to-access-mysql-with-python-version-3-4 How to Access MySQ ...

  9. Firemonkey TComboBox 下拉菜单字型修改方法 (D10)

    在 FMX 下的 TComboBox 下拉菜单字型修改有二种方法: uses FMX.Pickers; 使用 Style,需先设定好 Style 后,再指定预设项的 Style,方法如下: proce ...

  10. 利用Yii框架中的collections体验PHP类型化编程

    注:20150514 看过 惠新宸 关于PHP7的PPT后,看到了这一特性将被支持. Scalar Type Declarations function foo(int num) function ...