• Android框架揭秘.pdf

    2020-07-11 09:01:00
    Android框架揭秘.pdf 老外写的,看看那
  • ![图片说明](https://img-ask.csdn.net/upload/201510/20/1445312410_82017.png)
  • 1、框架或工具简介 百度cafe: ...是一款来自百度QA部门的Android平台自动化测试框架,框架覆盖了Android自动化测试的各种需求,致力于实现跨进程测试、快速测试、深度测试,解决了Android自动化测试中

    最近在学android的其他自动化测试框架和工具,整理下笔记

    1、框架或工具简介

    百度cafe:

    Cafe,A powerful test framework for Android named Case Automated Framework for Everyone.是一款来自百度QA部门的Android平台自动化测试框架,框架覆盖了Android自动化测试的各种需求,致力于实现跨进程测试、快速测试、深度测试,解决了Android自动化测试中的诸多难题,比如业界一直没有解决的跨进程测试问题。主要亮点如下:

      • 基于hook录制体系
      • 遍历测试
      • 跨app测试
      • pc agent设计
      • 使用android漏洞提权

    百度MTC:

    MTC是录制回放客户端,为Android开发者提供的自动化脚本测试工具,基于控件进行录制回放操作,使得测试准确性更可靠。主要功能如下:

      • 录制脚本:既可以录制脚本又可以编辑脚本,支持单次录制多个脚本;
      • 运行脚本:本地单机运行脚本,提供运行截图和运行日志;
      • 提交至云测试:单次提交云端多机型回放,支持最多20min的脚本时长

    2、安装和使用

    a、解压eclipse工具、安装JDK和Android SDK,并设置好环境变量,具体可参考http://wenku.baidu.com/link?url=KV8uJyk5sO29Q2EW34dn3Z3s3bDAdV8pPrzPZqYsfLrBQud6MskvvwjDlPW13z3WqJUfLVEASYRzud7coEVkfuGcZQ31mftHK6y5Dp_0CZm搭建好Android测试环境

    b、在 https://github.com/BaiduQA/Cafe/tree/master/downloads 下载最新的café.jar、在http://mtc.baidu.com/?pname=replayhome下载MTC工具

    c、启动eclipse,File->Import->Android->Existing Android Code Into Workspace导入被测工程

    d、File->New->Project->Android->Android Test Project新建测试工程,输入测试工程名称,Select Test Target选择前面导入的被测工程

    e、导入café.jar,测试工程右击,选择Build Path->Configure Build Path…,在libraries页面点击Add External JARs,导入b下载的café.jar

    f、新建测试类,在测试工程->src->测试类存放的包上右击,选择New->Java->Junit->Junit Test Case,在Name中输入Test Case的名称,选择Setup(),tearDown()和Constructor,点击完成

    g、或者直接使用MTC录制(工具的文件夹下有详细的使用说明文档),录制完成后直接生成Eclipse测试工程

    3、编写代码

    package gf.king.app.test;
    import java.util.ArrayList;
    import com.baidu.cafe.CafeTestCase;

    import android.annotation.SuppressLint;
    import android.content.Context;
    import android.util.Log;
    import android.view.View;
    import android.view.inputmethod.InputMethodManager;
    import android.widget.EditText;
    import android.widget.TextView;

    @SuppressWarnings("rawtypes")
    public class Testcase extends CafeTestCase {

    private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "gf.king.app.InitWindow";
    private static final String TARGET_PACKAGE = "gf.king.app";
    private static Class<?> launcherActivityClass;
    static {

    try {

    launcherActivityClass = Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME);

    } catch (ClassNotFoundException e) {

    throw new RuntimeException(e);

    }

    }


    @SuppressWarnings("unchecked")
    public Testcase() {

    super(TARGET_PACKAGE, launcherActivityClass);

    }


    @Override
    protected void setUp() throws Exception {

    super.setUp();

    }


    @Override
    protected void tearDown() {

    super.tearDown();

    }

    //编写测试用例, 运行case前需要开启cafe_setup.bat或cafe_setup.sh

    @SuppressLint("NewApi")
    public void test_NewCase_0() {

    //输入字符
    local.enterText(0, "Cafe");//0表示第一个文本框
    //长按
    local.clickLongInList(1);
    local.clickLongOnText("Cafe");
    local.clickLongOnScreen(100, 100);
    //点击文字(任何控件上的文字)
    local.clickOnText("Cafe");
    //获取控件
    local.getCurrentViews(Button.class);
    //获取logcat
    String[] logs = remote.getLog();
    //获取电量
    remote.getBatteryLevel();
    //获取亮度
    remote.getScreenBrightness();

    ................................

    }

    }

    4、运行

    PC连接模拟器或者设备,安装 Cafe.apk 、运行 cafe_setup.sh 或者 cafe_setup.bat(模拟器和设备没有安装和运行过的才需要),右击测试工程的测试类,选择Run As --> Run As Android JUnit Test运行;

    或者使用adb命令,D:\TDDOWNLOAD\Android_SDK\platform-tools>adb shell am instrument -e class gf.king.app.test.Testcase(测试类所在的包名+类名) -w gf.king.app.test(测试工程的package)/com.baidu.cafe.CafeTestRunner

    5、查看测试结果

    在eclipse的junit面板和Android shell中,可以清楚的看到运行结果

    eclipse中的结果:

    成功的

    junit 成功的

    失败的

    eclipse运行失败

    Android shell下的结果:

    成功的


    失败的

    Adb下运行失败


    展开全文
  • Android开源框架系列 Android开源项目 Android开发常用开源框架2 Android开发常用开源框架3 GitHub上最火的Android开源项目,所有开源项目都有详细资料和配套视频 2017年伊始,你需要尝试的25...

    Android开源框架系列

    开源框架

    开源框架

    开源框架

    https://github.com/JackChan1999/Android_Open_Project

    目录

    Square& JakeWharton

    框架名称 功能描述
    Picasso 一个强大的图片下载与缓存的库
    OkHttp Square出品,一个Http与Http/2的客户端
    Retrofit Square出品,类型安全的Http客户端
    ButterKnife 将Android视图和回调方法绑定到字段和方法上
    sqlbrite 一个响应式的数据查询框架
    keywhiz 一个隐私管理分配系统,能很好地与SOA配合
    LeakCanary 内存泄漏检测工具
    javapoet 动态生成Java源码
    phrase 字符串格式化
    dagger 依赖注入框架
    Flow Flow 将一个应用分成一个逻辑上的 Screen组合,Screen不是任何形式的特殊的库对象,而是一个被创造来代表我们应用视图的普通java对象(POJO)
    Mortar Mortar是一个专注拖拽和依赖注入的库,Mortar 用以下几个不同的部分将一个应用分为可组合的模块:Blueprints, Presenters and a boatload of custom Views
    RxBinding 可以实现数据层与View层的绑定,当数据发生变化,View会自动更新UI
    RxAndroid RxJava的扩展, 优雅地处理异步请求
    timber 对Android的Log类进行封装后的一个Log工具
    ViewPagerIndicator Paging indicator widgets compatible with the ViewPager
    DiskLruCache Java实现基于LRU的磁盘缓存
    Otto Otto 是 Square 公司出的一个事件库 (pub/sub 模式), 用来简化应用程序组件之间的通讯, otto 修改自 Google 的 Guava 库, 专门为 Android 平台进行了优化, 与上面介绍的 EventBus 相比, 两个库各有各的优点, 完全取决于我们自己项目的需求来选择它们哪一个
    javapoet A Java API for generating .java source files 动态生成Java源码

    阿里巴巴

    项目名称 功能描述
    freeline Freeline 是 Android 平台上的秒级编译方案,Instant Run 的替代品,也可以从 Freeline 官方主页来获取更多的信息。Freeline 由蚂蚁聚宝 Android 团队开发,它可以充分利用缓存文件,在几秒钟内迅速地对代码的改动进行编译并部署到设备上,有效地减少了日常开发中的大量重新编译与安装的耗时。Freeline能够为Android开发者节省很多喝杯咖啡的时间
    weex A framework for building Mobile cross-platform UI
    fastjson A fast JSON parser/generator for Java
    Dubbo Dubbo is a distributed, high performance RPC framework enpowering applications with service import/export capabilities
    AndFix AndFix is a library that offer hot-fix for Android App.
    dexposed dexposed enable ‘god’ mode for single android application.

    小米开源项目

    项目名称 功能描述
    Notes 小米便签社区开源版
    FileExplorer MIUI文件管理器社区开源版
    SoundRecorder MIUI录音机社区开源版

    Google开源项目

    项目名称 功能描述
    GCM Google Cloud Messaging 消息推送
    iosched: Google I/O Android App
    android-topeka Google官方给出的material design应用指南
    android-UniversalMusicPlayer Google官方给出的m音乐播放器,支持Android phones, tablets, Auto, Wear and Cast devices
    ExoPlayer An extensible media player for Android
    guava Google Core Libraries for Java 6+
    flexbox-layout FlexboxLayout is a library project which brings the similar capabilities of CSS Flexible Box Layout Module to Android.
    guice 轻量级的依赖注入框架
    gson A Java serialization/deserialization library that can convert Java Objects into JSON and back.
    protobuf Protocol Buffers - Google’s data interchange format
    material-design-icons Material Design icons by Google
    auto Auto 是 Java 生成器源代码集合,包括:AutoFactory - 兼容 JSR-330 的工厂;AutoService - ServiceLoader 的 Provider-configuration 文件;AutoValue - Java 1.6+ 的不可变 value-type 代码生成;Common - Helper 实用工具,用来编写注释处理器
    android-architecture A collection of samples to discuss and showcase different architectural tools and patterns for Android apps

    android-topeka

    categories.pngcategory_history.pngquiz_shakespeare.png

    android-UniversalMusicPlayer

    phone.pngphone_lockscreen.pngphone_fullscreen_player.png

    ExoPlayer

    An extensible media player for Android

    Streaming media with ExoPlayer - Google I/O 2016

    guava

    flexbox-layout

    flex-direction.gif

    1、图片加载,缓存,处理

    框架名称 功能描述
    Android Universal Image Loader 一个强大的加载,缓存,展示图片的库,已过时
    Picasso 一个强大的图片下载与缓存的库
    Fresco 一个用于管理图像和他们使用的内存的库
    Glide 一个图片加载和缓存的库,使用的App有:网易新闻
    GlidePalette Android Lollipop Palette is now easy to use with Glide
    PicassoPalette Android Lollipop Palette is now easy to use with Picasso !
    Picasso-transformations 一个为Picasso提供多种图片变换的库
    Glide-transformations 一个为Glide提供多种图片变换的库


    Picasso是著名的开源组织Square出品的图片处理框架,使用的比较多

    Glide是Google的员工基于Picasso开发,优化的,Android官网推荐使用的图片处理框架

    Fresco是Facebook开源的图片处理框架,真正做到了三级缓存,功能强大,强烈推荐使用

    Android Universal Image Loader是一个老牌的图片处理框架,但是在2015年的9月份已经停止更新维护,所以不推荐使用

    2、图片裁剪

    框架名称 功能描述
    uCrop Image Cropping Library for Android,使用的App有:薄荷,哔哩哔哩
    android-crop 图片裁剪,使用的App有:网易新闻,芒果TV
    cropper 图片裁剪开源框架
    Android-Image-Cropper Image Cropping Library for Android, optimized for Camera / Gallery
    PhotoCropper Android 大图片裁剪终极解决方案
    android-cropimage CropImage Activity from Gallery.apk packaged as a reusable Android library
    PhotoCrop A Library which can be used to crop images in Android similar to Facebook and Telegram,使用的App有:快手

    uCrop

    android-crop

    Android-Image-Cropper

    PhotoCropper

    PhotoCrop

    3、图片选择

    框架名称 功能描述
    MultiImageSelector 图片选择,使用的App有:薄荷
    BGAPhotoPicker-Android Android 图片选择、预览、九宫格图片控件、拖拽排序九宫格图片控件
    TakePhoto 轻量级Android照片处理框架
    RxGalleryFinal Android图片单选/多选、拍照、裁剪、压缩。视频选择和录制。GalleryFinal
    boxing 一个多媒体选择器库,B站出品。可以选择一张或者多张图片,提供预览和裁剪功能。同样支持gif图,选择视频和图像压缩功能。

    boxing

    multi_image.webpsingle_image_crop.webpvideo.webp

    MultiImageSelector

    BGAPhotoPicker-Android

    TakePhoto

    预览图
    运行效果图

    RxGalleryFinal

    4、图片转换,压缩,滤镜

    框架名称 功能描述
    Android-gpuimage 一个开源的基于GPU的图像处理库,提供各种各样的图像处理滤镜,并且支持照相机和摄像机的实时滤镜,使用的App有:快手
    photoview 使用的App有:薄荷,网易新闻
    circleimageview 圆形图片,使用的App有:薄荷
    RoundedImageView 圆形图片,使用的App有:薄荷
    SelectableRoundedImageView Android ImageView that supports different radii on each corner
    android-gif-drawable gif图片,使用的App有:网易新闻,快手
    Luban 可能是最接近微信朋友圈的图片压缩算法
    Compressor Compressor is a lightweight and powerful android image compression library

    Android-gpuimage

    circleimageview

    68747470733a2f2f7261772e6769746875622e636f6d2f68646f64656e686f662f436972636c65496d616765566965772f6d61737465722f73637265656e73686f742e706e67

    RoundedImageView

    SelectableRoundedImageView

    )

    5、高斯模糊,毛玻璃,图片模糊

    框架名称 功能描述
    android-stackblur Android StackBlur is a library that can perform a blurry effect on a Bitmap based on a gradient or radius, and return the result. The library is based on the code of Mario Klingemann.
    Blurry Blurry is an easy blur library for Android
    blurkit-android The missing Android blurring library. Fast blur-behind layout that parallels iOS.
    BlurView Dynamic iOS-like blur of underlying Views for Android
    ImageBlurring Android blurring image(bitmap) by java and jni

    android-stackblur

    68747470733a2f2f7261772e6769746875622e636f6d2f6b696b6f736f2f616e64726f69642d737461636b626c75722f6d61737465722f6172742f73637265656e73686f74312e706e6768747470733a2f2f7261772e6769746875622e636f6d2f6b696b6f736f2f616e64726f69642d737461636b626c75722f6d61737465722f6172742f73637265656e73686f74322e706e67

    Blurry

    blurkit-android

    BlurView

    BlurScreenshot.png

    ImageBlurring

    anim.gif

    缓存

    框架名称 功能描述
    LruCache Android原生API,内存缓存
    DiskLruCache Java实现基于LRU的磁盘缓存
    ASimpleCache 一个为android制定的轻量级的开源缓存框架
    base-diskcache Android 缓存库,融合了DiskLruCache和ASimpleCache

    网络请求

    框架名称 功能描述
    httpclient apache开源的网络请求框架,已过时
    AsyncHttpClient 基于httpclient封装,已过时
    OkHttp Square出品,一个Http与Http/2的客户端
    Retrofit Square出品,类型安全的Http客户端
    Volley Google推出的Android异步网络请求框架和图片加载框架,使用的App有:网易新闻


    从Android 6.0 开始,Google删除了apache的开源网络请求框架httpclient,所以基于httpclient的AsyncHttpClient也不推荐使用了

    Volley适合那些请求频繁但数据量不大的场景,不适用于大数据的请求,比如下载文件

    Android 6.0 后,Android开始使用OkHttp,而Retrofit是一个网络代理框架,可以更简单的使用OkHttp

    网络解析

    框架名称 功能描述
    Gson 一个Java序列化/反序列化库,可以将JSON和java对象互相转换
    Jackson Jackson可以轻松地将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象
    Fastjson Java上一个快速的JSON解析器/生成器
    HtmlPaser 一种用来解析单个独立html或嵌套html的方式
    Jsoup 一个以最好的DOM,CSS和jQuery解析html的库

    数据库

    框架名称 功能描述
    OrmLite JDBC和Android的轻量级ORM java包
    Sugar 用超级简单的方法处理Android数据库
    GreenDAO 一种轻快地将对象映射到SQLite数据库的ORM解决方案,使用的App有:薄荷,京东
    ActiveAndroid 以活动记录方式为Android SQLite提供持久化
    SQLBrite SQLiteOpenHelper 和ContentResolver的轻量级包装
    android-database-sqlcipher 数据库加密
    storio Beautiful API for SQLiteDatabase and ContentResolver
    realm-java 移动数据库,高性能数据库:一个SQLite和ORM的替换品
    ObjectBox 相信不少人都用过GreenDao和EventBus,这两库都是greenrobot公司出品。ObjectBox也是该公司出品。GreenDao号称是最快的与SQLite的对象关系映射(ORM)。但是自从2011年以来,公司声称发现了许多的缺陷,有很多问题影响了性能。所以开发出另外一套性能最好且易用的NoSQL数据库,优于其他数据库5-15倍的性能。

    依赖注入

    框架名称 功能描述
    ButterKnife 将Android视图和回调方法绑定到字段和方法上
    Dagger2 一个Android和java快速依赖注射器
    AndroidAnotations 快速安卓开发。易于维护
    RoboGuice Android平台的Google Guice 已退役
    guice Google开发的依赖注入框架

    图表Chart

    框架名称 功能描述
    WilliamChart 创建图表的Android库
    HelloCharts 兼容到API8的Android图表库,使用的App有:薄荷
    MPAndroidChart 一个强大的Android图表视图/图形库,使用的App有:春雨医生

    后台处理

    框架名称 功能描述
    Tape 一个轻快的,事务性的,基于文件的FIFO的库
    Android Priority Job Queue 一个专门为Android轻松调度任务的工作队列

    事件总线

    框架名称 功能描述
    EventBus 安卓优化的事件总线,简化了活动、片段、线程、服务等的通信,使用的App有:薄荷
    Otto 一个基于Guava的增强的事件总线
    HermesEventBus 一个基于EventBus的、能在进程间发送和接收event的库,在IPC或者插件开发中非常有用

    响应式编程

    框架名称 功能描述
    RxJava JVM上的响应式扩展
    RxJavaJoins 为RxJava提供Joins操作
    RxAndroid Android上的响应式扩展,在RxJava基础上添加了Android线程调度
    RxBinding 提供用RxJava绑定Android UI的API
    Agera Android上的响应式编程
    RxLifecycle Lifecycle handling APIs for Android apps using RxJava

    Log框架

    框架名称 功能描述
    Logger 简单,漂亮,强大的Android日志工具
    Hugo 在调试版本上注解的触发方法进行日志记录
    Timber 一个小的,可扩展的日志工具

    测试框架

    框架名称 功能描述
    Mockito Java编写的Mocking单元测试框架
    Robotium Android UI 测试
    Robolectric Android单元测试框架


    Android自带很多测试工具:JUnit,Monkeyrunner,UiAutomator,Espresso等

    调试框架

    框架名称 功能描述
    Stetho 调试Android应用的桥梁,使得可以利用Chrome开发者工具进行调试

    性能优化

    框架名称 功能描述
    LeakCanary 内存泄漏检测工具
    BlockCanary 轻松找出Android App界面卡顿元凶
    ACRA Android应用程序崩溃报告
    Google Guava Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等。 所有这些工具每天都在被Google的工程师应用在产品服务中。
    google protobuf 由google开发,并且在google内部使用。Protobuf的作用和xml、json是一回事,但他是二进制格式,性能好、效率高。ProtoBuf开发者指南

    热修复

    框架名称 功能描述
    tinker 腾讯开源的一个热修复框架
    AndFix alibaba热修复框架
    dexposed alibaba热修复框架

    二维码

    框架名称 功能描述
    Zxing 一个二维码开源框架
    barcodescanner 使用的App有:薄荷
    BGAQRCode-Android 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式
    zxing-android-embedded 使用的App有:春雨医生,芒果TV

    多媒体

    框架名称 功能描述
    ijkplayer Bilibili开源的视频播放器
    DanmakuFlameMaster Android开源弹幕引擎·烈焰弹幕使,使用的App有:网易新闻
    Vitamio 一款全能多媒体开发框架,全面支持硬件解码与 GPU 渲染
    FFmpeg 一个基于C语言的多媒体开源框架
    百度媒体云 基于百度视频处理、人脸识别、语音等技术媒体相关的整体解决方案
    ExoPlayer Google开源的视频播放器

     

    KSYStreamer_Android

    金山云Android采集推流SDK(Livestream SDK),支持内置/自定义美颜(Beauty Filter)、美声(Beauty Voice)、软硬编(Software/Hardware Encoder) 、网络自适应(Network Auto Adapt)、混音(Voice Mixer)、混响(Reverb)、画中画(PIP)、连麦(RTC)、动态贴纸(Sticker)

    KSYMediaPlayer_Android

    金山云Android播放SDK(KSYUN Live Streaming player SDK),支持RTMP HTTP-FLV HLS 协议(supporting RTMP HTTP-FLV HLS protocol),直播延时2-3秒(Living delay 2 or 3 seconds),supporting jitter control,software&hardware decode

    KSYLive_Android

    Android播放&推流融合版本[Android Play and LiveStreaming SDK] 直播延时2-3秒(Living delay 2 or 3 seconds),supporting jitter control,software&hardware decode, 支持内置/自定义美颜(Beauty Filter)、美声(Beauty Voice)、软硬编(Software/Hardware Encoder) 、网络自适应(Network Auto Adapt)、混音(Voice Mixer)、混响(Reverb)、画中画(PIP)

    KSYMediaPlayer_Android

    金山云Android播放SDK(KSYUN Live Streaming player SDK),支持RTMP HTTP-FLV HLS 协议(supporting RTMP HTTP-FLV HLS protocol),直播延时2-3秒(Living delay 2 or 3 seconds),supporting jitter control,software&hardware decode

    MD360Player4Android

    Android上全景视频渲染的库

    MD360Player4Android

    汉语转拼音

    框架名称 功能描述
    pinyin4j https://github.com/belerweb/pinyin4j
    TinyPinyin 适用于Java和Android的快速、低内存占用的汉字转拼音库。
    PinyinSearchLibrary The library of PinyinSearch,a Java Library which provide data parsing methods, data matching method and so on for T9 search and Qwerty search.PinyinSearch = T9Search + QwertySearch
    com.pinyin4android 唯品会使用

    下载

    框架名称 功能描述
    MultiThreadDownload 使用的App有:薄荷
    FileDownloader Android 文件下载引擎,稳定、高效、灵活、简单易用
    RxDownload 基于RxJava和Retrofit打造的下载工具, 支持多线程下载和断点续传, 智能判断是否支持断点续传等功能
    file-downloader 安卓上轻量级Http/Https文件下载框架,我的目标是让安卓文件下载越简单越好,尽可能以最简洁明了的方式完成复杂需求。

    动画

    框架名称 功能描述
    facebook:rebound A Java library that models spring dynamics and adds real world physics to your app
    ViewAnimator A fluent Android animation library
    Material-Animations Android Transition animations explanation with examples
    AndroidViewAnimations Cute view animation collection.
    ListViewAnimations An Android library which allows developers to easily add animations to ListView items
    recyclerview-animators An Android Animation library which easily add itemanimator to RecyclerView items.
    RecyclerViewItemAnimators An Android library which provides simple Item animations to RecyclerView items
    AnimationEasingFunctions Android Animation Easing Functions. Let’s make animation more real!
    BaseAnimation BaseAnimation收集网络Android相关动画集合,自定义控件等,近200多种源码
    FragmentAnimations 3D animations for support-v4 Fragment transition.
    AnimatedEditText Androids EditText that animates the typed text. EditText is extended to create AnimatedEditText and a PinEntryEditText.
    ViewPagerTransforms Library containing common animations needed for transforming ViewPager scrolling for Android v13+
    lottie-android Render After Effects animations natively on Android and iOS

    Android选择器类库

    包括日期时间选择器、单项选择器、地址选择器、颜色选择器、文件目录选择器、数字选择器、星座选择器等

    框架名称 功能描述
    material-calendarview material design 风格的日历控件使用的App有:薄荷
    MaterialDateTimePicker Pick a date or time on Android in style,使用的App有:薄荷
    android-times-square Standalone Android widget for picking a single date from a calendar view.
    AndroidPicker 安卓选择器类库,包括日期时间选择器、单项选择器、地址选择器、颜色选择器、文件目录选择器、数字选择器、星座选择器等。
    Android-PickerView 仿iOS的PickerView控件,有时间选择和选项选择并支持一二三级联动效果
    WheelPicker Simple and fantastic wheel view in realistic effect for android.
    Android-FilePicker Photopicker and document picker for android
    NumberPickerView another NumberPicker with more flexible attributes on Android platform
    Android-PickerView-Library Simple PickerView for Android

    Rajawali

    Rajawali是一个用于Android应用的3D引擎,基于 OpenGL ES 2.0。它可以用于普通的应用程序,以及实时壁纸。使用的App有:网易新闻

    aspectj

    AspectJ是一个面向切面的框架,它扩展了Java语言。使用的App有:网易新闻

    Apache Thrift

    可伸缩的跨语言服务开发框架,使用的App有:网易新闻

    Fabric SDK

    https://realm.io/cn/news/oredev-ty-smith-building-android-sdks-fabric/?utm_source=tuicool&utm_medium=referral

    GNU Trove

    Trove 是一个快速、轻量级 Collection 类的集合。Trove 提供所有标准 java.util Collections 类的更快的版本以及能够直接在原语(primitive)(例如包含 int 键或值的 Map 等)上操作的 Collections 类的版本。使用的App有:网易新闻

    Java-WebSocket

    简单的说,websocket就是用来做网页聊天以及手机推送用的。使用的App有薄荷

    以前不管使用HTTP轮询或使用TCP长连接等方式制作在线聊天系统,都有天然缺陷,随着HTML5的兴起,其中有一个新的协议WebSocket protocol,可实现浏览器与服务器全双工通信(full-duplex),它可以做到:浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。这个新的协议的特点正好适合这种在线即时通信。

    现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏览器需要不断的向服务器发出请求,然而HTTP request 的header是非常长的,里面包含的数据可能只是一个很小的值,这样会占用很多的带宽。

    而最比较新的技术去做轮询的效果是Comet – 用了AJAX。但这种技术虽然可达到全双工通信,但依然需要发出请求。

    在 WebSocket API,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

    org.eclipse.mat

    内存分析。使用的App有薄荷,网易新闻

    CommonAdapter

    使用的App有:薄荷

    Android-Best-Practices

    JKeyboardPanelSwitch

    Android键盘面板冲突 布局闪动处理方案

    起源,之前在微信工作的时候,为了给用户带来更好的基础体验,做了很多尝试,踩了很多输入法的坑,特别是动态调整键盘高度,二级页面是透明背景,魅族早期的Smart bar等, 后来逐一完善了,考虑到拥抱开源,看业界还是有很多应用存在类似问题。就有了这个repo

    使用的App有:薄荷

    美洽

    最快连接你与顾客 美洽,在线客服软件的漂亮之选

    MeiqiaSDK-Android https://github.com/Meiqia/MeiqiaSDK-Android

    使用的App有:薄荷

    logger

    使用的App有:薄荷

    DeepLinkDispatch

    最常见的应用就是在网页中跳转到App的某个页面,电商类应用可是都用了的。根据data跳转不同的页面

    使用的App有:京东

    Crouton

    Context sensitive notifications for Android

    Bolts-Android 一个底层库集合

    com.arcsoft.livebroadcast

    ReLinker

    Relink是一个加载Android so文件(shared library)的一个库。

    在Android平台上加载本地库的危险性

    kik

    CHAT ON KIK

    Kik lets you connect with friends, 
    groups and the world around you 
    through chat. And now, you can 
    chat with bots too.

    nanohttpd

    嵌入式HTTP服务器 ,NanoHTTPD是一个免费、轻量级的(只有一个Java文件) HTTP服务器,可以很好地嵌入到Java程序中。支持 GET, POST, PUT, HEAD 和 DELETE 请求,支持文件上传,占用内存很小。可轻松定制临时文件使用和线程模型。

    i-jetty

    jetty经过交叉编译移植到android平台的web服务器软件,它可以部署web网站

    com.googlecode.mp4parser

    Sparta

    com.hp.hpl.sparta:XML、DOM、XPath解析器,http://sparta-xml.sourceforge.net/

    JRegex

    JRegex:jregex:正则表达式库

    NativeSubprocess

    唯品会使用

    NativeSubprocess 是一个可以让你在android 程序中创建Linux子进程并执行你的java代码的so库。由于市面上典型的内存清理工具只清理apk 包关联的进程,而不会处理linux原生进程,所以NativeSubprocess 可以做什么您懂的!

    androidquery

    Android-Query(AQuery)是一个轻量级的开发包,用于实现 Android 上的异步任务和操作 UI 元素,可让 Android 应用开发更简单、更容易,也更有趣。

    唯品会使用,https://github.com/androidquery/androidquery

    MarsDaemon

    进程常驻,进程保活

    唯品会使用 https://github.com/Marswin/MarsDaemon

    SA-iSecurity

    SA-iSecurity 客户端安全输入系统,唯品会使用

    口碑推荐平台TapReason

    TapReason提供了一款无广告的App增长解决方案。他们的广告是最值得信赖的,因为这些广告都是来自于好友或同事的推荐。唯品会使用

    ImageViewZoom

    Android ImageView widget with zoom and pan capabilities,春雨医生使用

    LayoutCast

    Cast android code and resource changes to the running application through ADB. 
    Android SDK sucks. It’s so slow to build and run which waste me a lot of time every day.

    把代码和资源文件的改动直接同步到手机上,应用不需要重启。省去了编译运行漫长的等待,比较适合真机调试的时候使用。

    Joda-Time

    JodaTime 提供了一组Java类包用于处理包括ISO8601标准在内的date和time。可以利用它把JDK Date和Calendar类完全替换掉,而且仍然能够提供很好的集成。

    Joda-Time主要的特点包括:

    1. 易于使用:Calendar让获取”正常的”的日期变得很困难,使它没办法提供简单的方法,而Joda-Time能够 直接进行访问域并且索引值1就是代表January。
    2. 易于扩展:JDK支持多日历系统是通过Calendar的子类来实现,这样就显示的非常笨重而且事实 上要实现其它日历系统是很困难的。Joda-Time支持多日历系统是通过基于Chronology类的插件体系来实现。
    3. 提供一组完整的功能:它打算提供 所有关系到date-time计算的功能.Joda-Time当前支持6种日历系统,而且在将来还会继续添加。有着比JDK Calendar更好的整体性能等等。

    https://github.com/JodaOrg/joda-time

    msgpack

    MessagePack是一个基于二进制高效的对象序列化Library用于跨语言通信。 
    它可以像JSON那样,在许多种语言之间交换结构对象;但是它比JSON更快速也更轻巧。 比Google Protocol Buffers还要快4倍

    https://github.com/msgpack/msgpack-java

    scribejava

    ScribeJava 是一个简单的 Java 实现的 OAuth/OAuth2 库。

    Logback

    Logback是由log4j创始人Ceki Gülcü设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback- classic和logback-access。

    frame-video-view

    No more issues with VideoView

    JakeWharton scalpel

    Jake Wharton,Android开发领域传奇一般的存在,熟悉Android开发的同学应该都听说过,即便没有,也应该会经常用到他主导或参与贡献的开源 项目,他在GitHub上开源了多个Android兼容性、依赖注入相关的知名项目,目前就职Square, 也参与贡献了Square公司开源的诸如Retrofit, okhttp等热门项目。

    Jake大神喜欢以刀命名自己的项目,可能他觉得这能很好的表达它们作为开发利器的犀利程度,不过没准他也很喜欢中国武侠小说呢。

    他最有名的两把刀,一把是Dagger, 匕首,一个依赖注入框架,用来解耦开发中各模块依赖的,最早由他开发与维护,后来转给Google维护;另一把是同样大名鼎鼎的ButterKnife, 黄油刀,有了它,你再也不用写findViewById了,以后有机会给大家详细介绍它们。

    今天的主角是它们不那么知名的小兄弟,Scalpel,这把非常酷炫实用的解剖刀。

    他其实就是实现了一个三维效果的界面布局层次展示,不需要手机连接开发设备,只需要简单几行代码将其集成到你的应用中,即可开启酷炫之旅,它提供的功能包括:

    • 通过setLayerInteractionEnabled(boolean)可开启与关闭此功能。

    • 通过setDrawViews(boolean)可控制是否绘制View, 也就是说它可以仅仅是个简单的布局线框图,也可以是色彩丰富的真实效果图。

    • 通过setDrawIds(boolean)可控制是否显示各控件的Id, 你就能知道你自己正在调试的那个控件到底在哪了?

    • 通过setChromeColor,setChromeShadowColor可自定义线框图的颜色,随你喜欢。

    material-camera

    https://github.com/afollestad/material-camera

    material-camera

    hawk

    Android的安全、简单Key-Value存储

    bugsnag

    Bugsnag crash reporting for Android apps ,Bugsnag exception reporter for Android

    goldengate

    An Android annotation processor for generating type safe JavaScript bindings (Bridges)

    Helpshift

    slf4j

    SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。

    Nuwa热修复

    Nuwa, pure Java implementation, can hotfix your android application.

    Android 热修复Nuwa的原理及Gradle插件源码解析

    megvii人脸识别

    RadiusNetworks

    http://www.radiusnetworks.com/

    https://github.com/RadiusNetworks

    Swiper

    • 开源,免费,强大的移动端触摸滑动插件

    • Swiper常用于移动端网站的内容触摸滑动

    • Swiper3依然拥有progress,这是制作3D切换效果的利器

    • 在Swiper上加些小动画,制作高大上的展示

    Netty

    Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。

    也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。

    “快速”和“简单”并不用产生维护性或性能上的问题。Netty 是一个吸收了多种协议的实现经验,这些协议包括FTP,SMTP,HTTP,各种二进制,文本协议,并经过相当精心设计的项目,最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。

    cheesesquare:Demos the new Android Design library

    FBReaderJ

    FBReaderJ是一个Android 平台上的电子书阅读器。这是一个Java版的FBReader图书阅读器的克隆。 FBReaderJ支持多种电子书格式: oeb , epub ,和fb2 。直读从zip、tar和gzip等格式

    hawtdispatch

    HawtDispatch is a small ( less than 100k ) thread pooling and NIO handling framework API modeled after the libdispatch API. libdispatch is the API that Apple created to power the Grand Central Dispatch (GCD) technology in OS X. It allows you to more easily develop multi-threaded applications which can more easily scale to take advantage of all the processing cores on your machine. At the same time, its development model simplifies solving many of the problems that plague multi-threaded NIO development.

    ZeroMQ 一个轻量级消息内核

    autobahn-android

    WebSocket & WAMP in Java for Android

    Robotium

    Robotium 是一款国外的Android自动化测试框架,主要针对Android平台的应用进行黑盒自动化测试,它提供了模拟各种手势操作(点击、长 按、滑动等)、查找和断言机制的API,能够对各种控件进行操作。Robotium结合Android官方提供的测试框架达到对应用程序进行自动化的测 试。另外,Robotium 4.0版本已经支持对WebView的操作。Robotium 对Activity,Dialog,Toast,Menu 都是支持的。

    One Step & Big Bang

    锤子科技的一小步,智能手机进化的一大步


    什么是一步(One Step)?

    通过拖拽完成将信息发送至应用或联系人的动作,节省了在不同应用之间切换的诸多步骤,第一次打通了手持设备中应用间的边界

    进一步了解 One Step

    什么是大爆炸(Big Bang)?

    用拇指大面积按压屏幕中的文字,Big Bang 会将你按住的那一段文字全部“炸”开并且按照语义智能拆分成易于选取的独立的字和词,由你随心所欲地选择,并可直接搜索、分享和复制。Big Bang 开创性地解决了在手机这样的小屏幕上难于处理文字的弊端

    展开全文
  • Android开发框架汇总

    2015-02-12 15:40:26
    自开发Android已有两年多,接触到很多优秀的框架。觉得很有必要汇总一下,以便日后查阅。 帖子以后还会更新,总有新奇发生嘛。 1,最初接触到的Android开发框架是afinal,这里贴一个给github上的地址。 个人觉得...

    自开发Android已有两年多,接触到很多优秀的框架。觉得很有必要汇总一下,以便日后查阅。

    帖子以后还会更新,总有新奇发生嘛。

    1,最初接触到的Android开发框架是afinal,这里贴一个给github上的地址。  个人觉得使用afinal下载图片比较爽,至于ORM与IOC方面有更好的框架可以考虑。

    2,说到Android SQLite当属ORMLite框架了,ORMLite官网,小巧而方便,还有各种数据操作方法。最给力的是直接在xml里面配置类名,略去了繁琐的创建表语句。

    3,javax-inject IOC框架,github地址。这个框架是在开发中使用到的,框架并非我配置,不过使用起来感觉不错。具体的配置教程百度应该挺多的。

    4,Android Query (aquery)这个框架单看教程就知道挺强大的,不过我没有在实际开发中用过。这里贴一个教程,文档及例子的地址

    5,还有JSON解析部分的框架,比较主流的就是GSON了。这里就不多做介绍了,主要贴一下jar地址.

    展开全文
  • Android十大开源框架

    2018-06-02 15:48:37
  • Android开发中,类似下图的搜索功能非常常见今天,我将手把手教大家实现一款 封装了 历史搜索记录功能 & 样式 的Android 自定义搜索 开源库,希望你们会喜欢。 已在Github开源:地址:SearchView,欢迎 Star ! ...

    前言

    • Android开发中,类似下图的搜索功能非常常见

    搜索功能

    • 今天,我将手把手教大家实现一款 封装了 历史搜索记录功能 & 样式Android 自定义搜索框 开源库,希望你们会喜欢。

    示意图

    已在Github开源:地址:SearchView,欢迎 Star


    目录

    示意图


    1. 简介

    一款封装了 历史搜索记录功能 & 样式Android自定义搜索框

    已在Github开源:地址:SearchView,欢迎 Star

    示意图


    2. 需求场景

    • 在开始coding前, 理解好用户的需求场景 有助于我们更好地设计 & 实现功能
    • 需求场景如下

    示意图


    3. 业务流程图

    根据场景,梳理出来的功能业务流程图如下:

    示意图


    4. 功能需求

    根据功能的业务流程图,得出功能需求如下

    4.1 功能列表

    示意图

    4.2 功能原型图

    示意图

    4.3 示意图

    示意图


    5. 总体设计

    下面,将根据功能需求给出特定的技术解决方案

    5.1 总体解决方案

    示意图

    5.2 项目结构说明

    • 项目工程示意图

    示意图

    先下载Demo再阅读,效果会更好:Carson_Ho的Github地址:Search_Layout

    • 结构说明
    文件类型 作用
    SearchView.java 搜索框所有功能的实现
    RecordSQLiteOpenHelper.java 创建、管理数据库 & 版本控制
    EditText_Clear.java 自定义EdiText,丰富了自定义样式 & 一键删除
    ICallBack.java 点击搜索按键后的接口回调方法
    bCallBack.java 点击返回按键后的接口回调方法
    SearchListView.java 解决ListView & ScrollView的嵌套冲突
    search_layout.xml 搜索框的布局

    6. 功能详细设计

    下面将给出详细的功能逻辑

    6.1 关键字搜索

    • 描述:根据用户输入的搜索字段进行结果搜索
    • 原型图

    注:关键字搜索功能是因人而异的,所以本源码仅留出接口供开发者实现,不作具体实现

    示意图

    • 源码分析

    分析1:EditText_Clear.java

    • 作用:自定义EdiText,与系统自带的EdiText对比:多了左侧图片 & 右侧图片设置、一键清空EdiText内容功能
    • 具体代码如下:
    public class EditText_Clear extends android.support.v7.widget.AppCompatEditText {
        /**
         * 步骤1:定义左侧搜索图标 & 一键删除图标
         */
        private Drawable clearDrawable,searchDrawable;
    
        public EditText_Clear(Context context) {
            super(context);
            init();
            // 初始化该组件时,对EditText_Clear进行初始化 ->>步骤2
        }
    
        public EditText_Clear(Context context, AttributeSet attrs) {
            super(context, attrs);
            init();
        }
    
        public EditText_Clear(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init();
        }
    
        /**
         * 步骤2:初始化 图标资源
         */
        private void init() {
            clearDrawable = getResources().getDrawable(R.drawable.delete);
            searchDrawable = getResources().getDrawable(R.drawable.search);
    
            setCompoundDrawablesWithIntrinsicBounds(searchDrawable, null,
                    null, null);
            // setCompoundDrawablesWithIntrinsicBounds(Drawable left, Drawable top, Drawable right, Drawable bottom)介绍
            // 作用:在EditText上、下、左、右设置图标(相当于android:drawableLeft=""  android:drawableRight="")
            // 注1:setCompoundDrawablesWithIntrinsicBounds()传入的Drawable的宽高=固有宽高(自动通过getIntrinsicWidth()& getIntrinsicHeight()获取)
            // 注2:若不想在某个地方显示,则设置为null
            // 此处设置了左侧搜索图标
    
            // 另外一个相似的方法:setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom)介绍
            // 与setCompoundDrawablesWithIntrinsicBounds()的区别:可设置图标大小
              // 传入的Drawable对象必须已经setBounds(x,y,width,height),即必须设置过初始位置、宽和高等信息
              // x:组件在容器X轴上的起点 y:组件在容器Y轴上的起点 width:组件的长度 height:组件的高度
        }
    
    
        /**
         * 步骤3:通过监听复写EditText本身的方法来确定是否显示删除图标
         * 监听方法:onTextChanged() & onFocusChanged()
         * 调用时刻:当输入框内容变化时 & 焦点发生变化时
         */
    
        @Override
        protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
            super.onTextChanged(text, start, lengthBefore, lengthAfter);
            setClearIconVisible(hasFocus() && text.length() > 0);
            // hasFocus()返回是否获得EditTEXT的焦点,即是否选中
            // setClearIconVisible() = 根据传入的是否选中 & 是否有输入来判断是否显示删除图标->>关注1
        }
    
        @Override
        protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
            super.onFocusChanged(focused, direction, previouslyFocusedRect);
            setClearIconVisible(focused && length() > 0);
            // focused = 是否获得焦点
            // 同样根据setClearIconVisible()判断是否要显示删除图标
        }
    
        /**
         * 关注1
         * 作用:判断是否显示删除图标
         */
        private void setClearIconVisible(boolean visible) {
            setCompoundDrawablesWithIntrinsicBounds(searchDrawable, null,
                    visible ? clearDrawable : null, null);
        }
    
        /**
         * 步骤4:对删除图标区域设置点击事件,即"点击 = 清空搜索框内容"
         * 原理:当手指抬起的位置在删除图标的区域,即视为点击了删除图标 = 清空搜索框内容
         */
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            switch (event.getAction()) {
                // 原理:当手指抬起的位置在删除图标的区域,即视为点击了删除图标 = 清空搜索框内容
                case MotionEvent.ACTION_UP:
                    Drawable drawable = clearDrawable;
                    if (drawable != null && event.getX() <= (getWidth() - getPaddingRight())
                            && event.getX() >= (getWidth() - getPaddingRight() - drawable.getBounds().width())) {
                        setText("");
                    }
                    // 判断条件说明
                    // event.getX() :抬起时的位置坐标
                    // getWidth():控件的宽度
                    // getPaddingRight():删除图标图标右边缘至EditText控件右边缘的距离
                    // 即:getWidth() - getPaddingRight() = 删除图标的右边缘坐标 = X1
                    // getWidth() - getPaddingRight() - drawable.getBounds().width() = 删除图标左边缘的坐标 = X2
                    // 所以X1与X2之间的区域 = 删除图标的区域
                    // 当手指抬起的位置在删除图标的区域(X2=<event.getX() <=X1),即视为点击了删除图标 = 清空搜索框内容
                    // 具体示意图请看下图
                    break;
            }
            return super.onTouchEvent(event);
        }
    
    
    }
    

    示意图

    对于含有一键清空功能 & 更多自定义样式的EditText自定义控件具体请看我的另外一个简单 & 好用的开源组件:Android自定义EditText:手把手教你做一款含一键删除&自定义样式的SuperEditText

    分析2:SearchListView.java

    • 作用:解决 ListView & ScrollView 的嵌套冲突
    • 具体代码如下:
    public class Search_Listview extends ListView {
        public Search_Listview(Context context) {
            super(context);
        }
    
        public Search_Listview(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public Search_Listview(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        // 通过复写其onMeasure方法,达到对ScrollView适配的效果
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                    MeasureSpec.AT_MOST);
            super.onMeasure(widthMeasureSpec, expandSpec);
        }
    
    }
    

    分析3: search_layout.xml

    • 作用:搜索框的布局
    • 具体代码如下:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:focusableInTouchMode="true"
        android:orientation="vertical">
    
        <LinearLayout
            android:id="@+id/search_block"
            android:layout_width="match_parent"
            android:layout_height="10dp"
            android:orientation="horizontal"
            android:paddingRight="10dp"
            >
    
            // 返回按钮
            <ImageView
                android:layout_width="38dp"
                android:layout_height="38dp"
                android:layout_gravity="center_vertical"
                android:padding="10dp"
                android:src="@drawable/back" />
    
            // 搜索框(采用上面写的自定义EditText
            <scut.carson_ho.searchview.EditText_Clear
                android:id="@+id/et_search"
                android:layout_width="0dp"
                android:layout_height="fill_parent"
                android:layout_weight="264"
                android:background="@null"
                android:drawablePadding="8dp"
                android:gravity="start|center_vertical"
                android:imeOptions="actionSearch"
                android:singleLine="true"
                // 最后2行 = 更换输入键盘按钮:换行 ->>搜索
                />
            
        </LinearLayout>
    
        // 下方搜索记录布局 = ScrollView+Listview
        <ScrollView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
    
                    // Listview布局(采用上述讲解的SearchListView,解决了与ScrollView的冲突)
                    <scut.carson_ho.searchview.SearchListView
                        android:id="@+id/listView"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content">
    
                    </scut.carson_ho.searchview.SearchListView>
    
                <TextView
                    android:id="@+id/tv_clear"
                    android:layout_width="match_parent"
                    android:layout_height="40dp"
                    android:background="#F6F6F6"
                    android:gravity="center"
                    android:visibility="invisible"
                    android:text="清除搜索历史" />
            </LinearLayout>
        </ScrollView>
    </LinearLayout>
    
    

    分析4:ICallBack.java、bCallBack.java

    • 作用:搜索按键、返回按键回调接口
    • 具体代码如下:
    /**
     * ICallBack.java
     */
    public interface ICallBack {
        void SearchAciton(String string);
    
    }
    
    /**
     * bCallBack.java
     */
    public interface bCallBack {
        void BackAciton();
    }
    

    分析5:SearchView.java

    • 作用:涵盖搜索框中所有功能,此处主要讲解 关键字搜索 功能实现
    • 具体代码如下:
    
    /**
       * 步骤1:初始化成员变量
       */
    
        // 搜索框组件
        private EditText et_search; // 搜索按键
        private LinearLayout search_block; // 搜索框布局
        private ImageView searchBack; // 返回按键
    
        // 回调接口
        private  ICallBack mCallBack;// 搜索按键回调接口
        private  bCallBack bCallBack; // 返回按键回调接口
    
        // ListView列表 & 适配器
        private SearchListView listView;
        private BaseAdapter adapter;
    
       /**
         * 步骤2:绑定 搜索框 组件
         */
        
        private void initView(){
            
            // 1. 绑定R.layout.search_layout作为搜索框的xml文件
            LayoutInflater.from(context).inflate(R.layout.search_layout,this);
            
            // 2. 绑定搜索框EditText
            et_search = (EditText) findViewById(R.id.et_search);
    
            // 3. 搜索框背景颜色
            search_block = (LinearLayout)findViewById(R.id.search_block);
       
            // 4. 历史搜索记录 = ListView显示
            listView = (Search_Listview) findViewById(R.id.listView);
            
            // 5. 删除历史搜索记录 按钮
            tv_clear = (TextView) findViewById(R.id.tv_clear);
            tv_clear.setVisibility(INVISIBLE); // 初始状态 = 不可见
            
        }
    
    /**
        * 步骤3
        * 监听输入键盘更换后的搜索按键
        * 调用时刻:点击键盘上的搜索键时
        */
            et_search.setOnKeyListener(new View.OnKeyListener() {
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                    if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
                        
                        // 点击搜索按键后,根据输入的搜索字段进行查询
                        // 注:由于此处需求会根据自身情况不同而不同,所以具体逻辑由开发者自己实现,此处仅留出接口
                        if (!(mCallBack == null)){
                            mCallBack.SearchAciton(et_search.getText().toString());
                        }
                        Toast.makeText(context, "需要搜索的是" + et_search.getText(), Toast.LENGTH_SHORT).show();
                        
                       
                    }
                    return false;
                }
            });
    
     /**
         * 步骤4:回调接口
         */
    
    // 搜索按键回调接口
    public interface ICallBack {
        void SearchAciton(String string);
    }
    
    // 返回按键接口回调
        public void setOnClickBack(bCallBack bCallBack){
            this.bCallBack = bCallBack;
    
        }
    

    6.2 实时显示历史搜索记录

    • 描述:包括 最近搜索记录 & 相似搜索记录
    • 原型图

    示意图

    • 源码分析

    分析1:RccordSQLiteOpenHelper.java

    • 作用:创建、管理数据库 & 版本控制

    该数据库用于存储用户的搜索历史记录

    • 具体代码如下:

    对于Android SQLlite数据库的操作请看文章:Android:SQLlite数据库操作最详细解析

    
    // 继承自SQLiteOpenHelper数据库类的子类
    public class RecordSQLiteOpenHelper extends SQLiteOpenHelper {
    
        private static String name = "temp.db";
        private static Integer version = 1;
    
        public RecordSQLiteOpenHelper(Context context) {
            super(context, name, null, version);
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            // 打开数据库 & 建立一个名为records的表,里面只有一列name来存储历史记录:
            db.execSQL("create table records(id integer primary key autoincrement,name varchar(200))");
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
    }
    
    

    分析2:SearchView.java

    • 作用:涵盖搜索框中所有功能,此处主要讲解 实时显示历史搜索记录 功能实现
    • 具体代码如下:
       /**
         * 步骤1:初始化变量
         */
        // 用于存放历史搜索记录
        private RecordSQLiteOpenHelper helper ;
        private SQLiteDatabase db;
    
        // ListView列表 & 适配器
        private SearchListView listView;
        listView = (SearchListView) findViewById(R.id.listView);
        private BaseAdapter adapter;
    
        // 实例化数据库SQLiteOpenHelper子类对象
        helper = new RecordSQLiteOpenHelper(context);
    
    /**
      * 步骤2:搜索框的文本变化实时监听
      */
            et_search.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    
                }
    
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
    
                }
    
                // 输入文本后调用该方法
                @Override
                public void afterTextChanged(Editable s) {
                    // 每次输入后,模糊查询数据库 & 实时显示历史搜索记录
                    // 注:若搜索框为空,则模糊搜索空字符 = 显示所有的搜索历史
                    String tempName = et_search.getText().toString();
                    queryData(tempName); // ->>关注1
    
                }
            });
    
    /**
       * 步骤3:搜索记录列表(ListView)监听
       * 即当用户点击搜索历史里的字段后,会直接将结果当作搜索字段进行搜索
       */
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    
                    // 获取用户点击列表里的文字,并自动填充到搜索框内
                    TextView textView = (TextView) view.findViewById(android.R.id.text1);
                    String name = textView.getText().toString();
                    et_search.setText(name);
                    Toast.makeText(context, name, Toast.LENGTH_SHORT).show();
                }
            });
    
    
    /**
       * 关注1
       * 模糊查询数据 & 显示到ListView列表上
       */
        private void queryData(String tempName) {
    
            // 1. 模糊搜索
            Cursor cursor = helper.getReadableDatabase().rawQuery(
                    "select id as _id,name from records where name like '%" + tempName + "%' order by id desc ", null);
            // 2. 创建adapter适配器对象 & 装入模糊搜索的结果
            adapter = new SimpleCursorAdapter(context, android.R.layout.simple_list_item_1, cursor, new String[] { "name" },
                    new int[] { android.R.id.text1 }, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
            // 3. 设置适配器
            listView.setAdapter(adapter);
            adapter.notifyDataSetChanged();
            
            System.out.println(cursor.getCount());
            // 当输入框为空 & 数据库中有搜索记录时,显示 "删除搜索记录"按钮
            if (tempName.equals("") && cursor.getCount() != 0){
                tv_clear.setVisibility(VISIBLE);
            }
            else {
                tv_clear.setVisibility(INVISIBLE);
            };
    
        }
    

    6.3 删除历史搜索记录

    • 描述:清空所有历史搜索记录
    • 原型图

    示意图

    • 源码分析
      /**
         * 步骤1:初始化变量
         */
          private TextView tv_clear;  // 删除搜索记录按键
          tv_clear = (TextView) findViewById(R.id.tv_clear);
          tv_clear.setVisibility(INVISIBLE);// 初始状态 = 不可见
    
    /**
      * 步骤2:设置"清空搜索历史"按钮
      */
            tv_clear.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    // 清空数据库->>关注2
                    deleteData();
                    // 模糊搜索空字符 = 显示所有的搜索历史(此时是没有搜索记录的) & 显示该按钮的条件->>关注3
                    queryData("");
                }
            });
    
    /**
      * 关注2:清空数据库
      */
        private void deleteData() {
    
            db = helper.getWritableDatabase();
            db.execSQL("delete from records");
            db.close();
            tv_clear.setVisibility(INVISIBLE);
        }
    
     /**
         * 关注3
         * 模糊查询数据、显示到ListView列表上 & 确定显示 “删除历史按钮”条件
         */
        private void queryData(String tempName) {
            // 步骤1、2、3上面已经提到了,直接看步骤4
            // 1. 模糊搜索
            Cursor cursor = helper.getReadableDatabase().rawQuery(
                    "select id as _id,name from records where name like '%" + tempName + "%' order by id desc ", null);
            // 2. 创建adapter适配器对象 & 装入模糊搜索的结果
            adapter = new SimpleCursorAdapter(context, android.R.layout.simple_list_item_1, cursor, new String[] { "name" },
                    new int[] { android.R.id.text1 }, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
            // 3. 设置适配器
            listView.setAdapter(adapter);
            adapter.notifyDataSetChanged();
    
            // 4. 当输入框为空 & 数据库中有搜索记录时,才显示 "删除搜索记录"按钮
            if (tempName.equals("") && cursor.getCount() != 0){
                tv_clear.setVisibility(VISIBLE);
            }
            else {
                tv_clear.setVisibility(INVISIBLE);
            };
    
        }
    

    6.4 保存历史搜索记录

    • 描述:将用户输入的搜索字段保存到数据库中
    • 原型图

    示意图

    • 源码分析
    /**
      * 监听输入键盘更换后的搜索按键
      * 调用时刻:点击键盘上的搜索键时
      */
            et_search.setOnKeyListener(new View.OnKeyListener() {
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                    if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
                        // 步骤1已经讲解过,直接看步骤2
    
                        // 1. 点击搜索按键后,根据输入的搜索字段进行查询
                        // 注:由于此处需求会根据自身情况不同而不同,所以具体逻辑由开发者自己实现,此处仅留出接口
                        if (!(mCallBack == null)){
                         mCallBack.SearchAciton(et_search.getText().toString());
                        }
                        Toast.makeText(context, "需要搜索的是" + et_search.getText(), Toast.LENGTH_SHORT).show();
    
                        // 2. 点击搜索键后,对该搜索字段在数据库是否存在进行检查(查询)->> 关注3
                        boolean hasData = hasData(et_search.getText().toString().trim());
                        // 3. 若存在,则不保存;若不存在,则将该搜索字段保存(插入)到数据库,并作为历史搜索记录
                        if (!hasData) {
                            insertData(et_search.getText().toString().trim()); // ->>关注4
                            queryData("");
                        }
                    }
                    return false;
                }
            });
    
    /**
      * 关注3
      * 检查数据库中是否已经有该搜索记录
      */
        private boolean hasData(String tempName) {
            // 从数据库中Record表里找到name=tempName的id
            Cursor cursor = helper.getReadableDatabase().rawQuery(
                    "select id as _id,name from records where name =?", new String[]{tempName});
            //  判断是否有下一个
            return cursor.moveToNext();
        }
    
    /**
      * 关注4
      * 插入数据到数据库,即写入搜索字段到历史搜索记录
      */
        private void insertData(String tempName) {
            db = helper.getWritableDatabase();
            db.execSQL("insert into records(name) values('" + tempName + "')");
            db.close();
        }
    

    7. 具体使用

    示意图


    8. 贡献代码

    • 希望你们能和我一起完善这款简单 & 好用的SearchView控件,具体请看:贡献说明
    • 关于该开源项目的意见 & 建议可在Issue上提出。欢迎 Star

    9. 总结

    • 相信你一定会喜欢上 这款简单 & 好用的SearchView控件

    已在Github上开源:SearchView,欢迎 Star

    • 下一篇文章我将继续进行一些有趣的自定义View实例讲解,感兴趣的同学可以继续关注carson_ho的微信公众号
      示意图
      示意图

    更多简单好用的开源库:简单 & 好用的开源组件:
    自定义EditText:手把手教你做一款含一键删除&自定义样式的SuperEditText


    请 帮顶 或 评论点赞!因为你的鼓励是我写作的最大动力!

    展开全文
  • 新版的Android百度云界面效果非常炫,给人焕然一新的感觉,如下图所示。   其实仔细研究,会发现也并不是那么复杂: 1.整个界面主容器是一个ViewPager,只是在左下角有一个切换的Button。 2.ViewPager有两个界面...
  • 最近公司要把百度地图集成的项目中,于是我就研究了一天百度地图的SDK,当前的版本:Android SDK v3.0.0 。 虽然百度地图网上相关代码比较多,大多可能都是比较旧的版本,且百度地图API的改动感觉也比较大,所以再此...
  • Android开发过程中,网络是我们很重要的一部分,因此我们就以网络框架开始。在这个框架开发过程中,我会整理开发思路、以及遇到一些设计问题时会有怎么样的考虑、解决方案,当然这只是我个人的观点,大家也可以有...
  • 百度地图(二) - 模仿百度地图搜索1 模仿百度地图搜索 1 在activity_Main在添加 TextView android:id="@+id/tvSeek" android:layout_marginTop="20dp" android:layout_marginRight="20dp" android
  • Android 开源框架精选

    2019-08-26 10:06:52
    2、https://github.com/wasabeef/awesome-android-ui 目录UIUI卫星菜单节选器下拉刷新模糊效果HUD与Toast进度条UI其它 动画网络相关响应式编程地图数据库图像浏览及处理视频音频处理测试及调试动态更...
  • var timeOut=null;... // 添加弹出数据  var data_infoveh = [  [117.215914,39.190908,'1','30','0001','12345678','2016年12月30日',100,'1:30',],  [129.404425,37.669868,'2','30','000
  • 仿Google百度搜索输入关键字有下单列表选择
  • 最近反复研究日常经典必用的几个android app,从主界面带来的交互方式入手
  • GitHub上受欢迎的Android UI Library https://mvnrepository.com/ https://jar-download.com/ https://docs.oracle.com/javase/7/docs/api/ ...
  • Android 开源UI框架汇总

    2019-06-12 10:23:46
    2、https://github.com/wasabeef/awesome-android-ui 目录UIUI卫星菜单节选器下拉刷新模糊效果HUD与Toast进度条UI其它 动画网络相关响应式编程地图数据库图像浏览及处理视频音频处理测试及调试动态更...
  • 各种Android UI开源框架

    2018-01-25 11:23:42
    自己总结的Android开源项目及库。 github排名 https://github.com/trending,github搜索:https://github.com/search Android库学习收集QQ群: 339129051 欢迎入群。 目录 UI UI卫星菜单节选器下拉刷新模糊效果HUD与...
1 2 3 4 5 ... 20
收藏数 33,911
精华内容 13,564