Android 开源项目源码深入分析(第二期)

图片 1图片 2

DownloadManager是Android用系统服务的法子提供的用来优化管理长日子下载任务的工具。
正文将基于Android N的源码进行深入分析。

在Android.mk中加入 LOCAL_JACK_ENABLED := disabled
并不能够利用系统签字 #LOCAL_CERTIFICATE := platform

https://github.com/simple-android-framework-exchange/android\_design\_patterns\_analysis

Android 开源项目源码剖判(第二期)

 

开卷目录

  • android-Ultra-Pull-To-Refresh
    源码剖判
  • DynamicLoadApk
    源码分析
  • NineOldAnimations
    源码深入分析
  • SlidingMenu
    源码深入分析
  • Cling 源码分析
  • BaseAdapterHelper
    源码分析
  • Side Menu.Android
    源码深入分析
  • DiscreteSeekBar
    源码剖析
  • CalendarListView
    源码剖判
  • PagerSlidingTabStrip
    源码深入分析
  • 公物才能点之 Android
    动画基础
  • 公共技能点之 Java 反射
    Reflection
  • Volley
    源码剖析
  • Android Universal Image Loader
    源码分析
  • Dagger
    源码解析
  • 伊芙ntBus
    源码深入分析
  • xUtils
    源码剖判
  • ViewPagerindicator
    源码深入分析
  • HoloGraphLibrary
    源码分析
  • CircularFloatingActionMenu
    源码剖判
  • PhotoView
    源码分析
  • Android Lock Pattern
    源码深入分析
  • 公物本事点之 Java
    动态代理
  • 集体本领点之 Java 注解Annotation
  • 公物技能点之 View
    绘制流程
  • 公共手艺点之依赖注入
  • 公家技艺点之 View
    事件传递

原文 

 

用力推荐Android 开荒大计算文章:招待收藏Android 开荒本领作品大总计

DownloadManager的使用办法
DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
Uri uri = Uri.parse("downloadUrl");
DownloadManager.Request request = new Request(uri);
long reference = downloadManager.enqueue(request);

调用enqueue方法之后,只要数据连接可用而且Download
Manager可用,下载就能开头。
要在下载完毕的时候获得二个系统通报(notification),注册贰个播放接受者来接收ACTION_DOWNLOAD_COMPLETE广播,那几个广播会包罗叁个EXTRA_DOWNLOAD_ID音讯在intent中满含了早就完毕的这些下载的ID。

别的更详细API使用方法请参见Android
DownloadManager的使用一文,此处不再详述。

Android.mk内定java编译语言

LOCAL_JAVA_LANGUAGE_VERSION := 1.7 / 1.8.

android-Ultra-Pull-To-Refresh 源码分析

多个有力的 Andriod 下拉刷新框架。首要特点:(1) 承接于 ViewGroup,Content
不仅可以够是常用的 ListView、GridView,还足以是别的任何 View。(2)
简洁完善的 Header 抽象,方便开展拓宽,创设切合供给的头顶。UltraPT翼虎总体设计比较轻松清晰,首先抽象出了七个接口,作用接口和 UI
接口。PtrHandler
代表下拉刷新的效益接口,包蕴刷新功效回调方法以及推断是不是足以下拉的主意。客户完毕此接口来开展数量刷新职业。

图片 3

DownloadManager的调用管理

DownloadManager的进行入口方法enqueue的源码如下所示:

ContentValues values = request.toContentValues(mPackageName);
Uri downloadUri = mResolver.insert(Downloads.Impl.CONTENT_URI, values);
long id = Long.parseLong(downloadUri.getLastPathSegment());
return id;

里头,request为呼吁早先化传入的DownloadManager.途乐quest对象,传入要求后
toContentValues()方法会以传播包老马待插入的数量生成ContentValues,方法中会有贰个预感检查,代码如下所示:

ContentValues toContentValues(String packageName) {
    ContentValues values = new ContentValues();
    assert mUri != null;
    //.......
}

实则看来那处断言检查有一点纠葛,在组织Uri对象的时候曾经打开了空推断,为啥那边还要开展叁回断言检查呢,不是会有冗余吗?

在插入ContentValues时,mResolver.insert()实际调用的是系统DownloadProvider中的insert方法,插入重临的downloadUri会在原始Uri基础上调用ContentUris.withAppendedId(Downloads.Impl.CONTENT_URI, rowID)加上二个rowId再次来到二个形如content://downloads/my_downloads/33的Uri,经过Uri截取之后,实操的reference其实是数据库中的rowId(数据库行号)。

DynamicLoadApk 源码剖判

DynamicLoadApk 是一个开源的 Android 插件化框架。插件化的助益满含:(1)
模块解耦,(2) 动态晋级,(3) 高效并行开拓(编写翻译速度越来越快) (4)
按需加载,内部存款和储蓄器占用更低档等。原理是 DexClassLoader 加 Activity
代理,即在容器中登记多少个代理的 Activity,运行插件的 Activity
时实际运转的都以代理的 Activity,进而解决 Activity 必需登记的主题素材。

Android 项目源码获取格局 :微信关切大伙儿号 技士Android ,回复关键字,就可以免费获得。

图片 4

体贴入微公众号 程序员Android ,回复关键字 Launcher,就可以获得源码。

图片 5Launcher
3达成效果与利益

关切大伙儿号 程序员Android ,回复关键字 菜鸟信息,就可以获得源码。

图片 6新手新闻客商端

精细入微公众号 程序员Android ,回复关键字
Kotlin音讯顾客端,就可以获得源码。

图片 7落成效果.gif

关注公众号 程序员Android ,回复关键字
新手百货店客商端,就可以获取源码。

图片 8落到实处际效果果与利益图.png

关切民众号 程序员Android ,回复关键字
近录制客户端,就能够获取源码。

图片 9贯彻效益图

精细入微公众号 程序员Android ,回恢复关贸总协定缔约国地位键字 仿B站顾客端,就可以获取源码。

图片 10达成效果与利益图.png

关心公众号 程序员Android ,回复关键字
仿抖音录像客商端,就可以获得源码。

图片 11落到实处际效果果与利益.jpg

关怀大伙儿号 程序员Android ,回复关键字
仿饿了么客商端,就能够获得源码。

图片 12兑现效益.jpg

关怀备至大伙儿号 程序员Android ,回复关键字
仿OPPO商场顾客端,就能够取得源码。

图片 13达成效果与利益图.jpg

关注大伙儿号 程序员Android ,回复关键字
仿拼多多客商端,就能够获得源码。

图片 14落到实处际效果果与利益图

关心群众号 程序员Android ,回复关键字
仿书旗小说客户端,就可以获得源码。

图片 15贯彻效果.png

关怀备至民众号 程序员Android ,回复关键字
仿头条顾客端,就可以获得源码。

图片 16达成效果与利益图.jpg

关怀公众号 程序员Android ,回复关键字
仿天涯论坛云音乐客商端,就能够获得源码。

图片 17落到实处际效果果与利益图

关切大伙儿号 程序员Android ,回复关键字
仿今日头条顾客端,就可以获得源码。

图片 18兑现效果.gif

关怀备至民众号 程序员Android ,回复关键字 杂货铺顾客端,就能够获得源码。

图片 19完结效果.png

关怀大伙儿号 程序员Android ,回复关键字
社区论坛客户端,就能够获取源码。

图片 20落实际效果果与利益.jpg

关注大伙儿号 程序员Android ,回复关键字
非同一般事顾客端,就能够获取源码。

图片 21贯彻效果与利益图

关怀备至公众号 程序员Android ,回复关键字 专辑客商端,就能够获得源码。

图片 22完毕效果与利益图图片 23图片 24长按识别二维码,领福利

迄今截至,本篇已终止,如有不对的位置,接待您的提议与指正。同时希望你的关注,多谢您的阅读,谢谢!

图片 25

如有侵犯权益,请联系小编,作者对此深感抱歉,届时作者会删除小说,立时停止侵犯版权行为,请你多多原谅。

图片 26

DownloadProvider的调用管理

在头里版本中,DownloadProvider在插入数据后,会直接以context.start瑟维斯的措施
来运转DownloadService。进行异步职务下载。而在Android
N版本中引进了JobSchedule组件来扩充异步下载职务的管理。
在Android
L版本中引进的JobScheduler可以决定耗能,具体运用能够参照:Android
JobSchedule职业调解,
内部DownlaodProvider中的insert方法中的关键操作如下所示:

final long token = Binder.clearCallingIdentity();
try {
  Helpers.scheduleJob(getContext(), rowID);
} finally {
  Binder.restoreCallingIdentity(token);
}

其间Helpers.scheduleJob()方法中动用rowId将那条下载音讯查询出来,然后调用绑定的DownloadJobService实行下载职分。假若线程调解失利,会回来false。

public static void scheduleJob(Context context, long downloadId) {
    final boolean scheduled = scheduleJob(context, DownloadInfo.queryDownloadInfo(context, downloadId));
    if (!scheduled) {
        // If we didn't schedule a future job, kick off a notification
        // update pass immediately
        getDownloadNotifier(context).update();
    }
}

那时getDownloadNotifier(context).update()会将遍历出具备未删减的

NineOldAnimations 源码分析

NineOldAndroids 是一款帮忙在低版本(API 11 以下)使用 Android 属性动画以及
3D 旋转动画的框架,它提供了一多元如 ViewAnimator, ObjectAnimator,
ViewPropertyAnimator 等 API 来产生这么些动画片,消除了 Android
动画框架在低版本的包容性难题。在 API 11 (Honeycomb-Android 3.0)后
Android 推出了质量动画、X 轴翻转等动画片效果,不过这么些职能却不能够运作在 API
11 以下,NineOldAndroids
的产出使得那一个动画片效果能够同盟低版本系统,保障动画在各样系统版本能够完美运营。

DownloadJobService调整实践

DownloadService中调节的线程初叶下载,在onStartJob中用rowId查出来后,直接开线程初叶下载,具体代码如下所示:

public boolean onStartJob(JobParameters params) {
  final int id = params.getJobId();
  // Spin up thread to handle this download
  final DownloadInfo info = DownloadInfo.queryDownloadInfo(this, id);
  if (info == null) {
      Log.w(TAG, "Odd, no details found for download " + id);
      return false;
    }
    final DownloadThread thread;
    synchronized (mActiveThreads) {
      thread = new DownloadThread(this, params, info);
      mActiveThreads.put(id, thread);
    }
    thread.start();
    return true;
}

SlidingMenu 源码深入分析

SlidingMenu
是七个庞大的左边栏菜单,通过拖动荧屏边缘滑出美食做法,援助荧屏左右划出,扶助菜单
Zoom、Scale、Slide Up 二种动画样式出现。首要特点如下:(1)
左边栏能够是多个 Fragment,包涵别的 View;(2)
使用轻易方便,支持左滑和右滑等;(3) 自定义侧边栏展现动画。

DownloadJob瑟维斯中的暂停、裁撤与成就

DownloadJobService中在线程开启后,会刷新显示相应的通告栏,通过布告栏UI中的相应调控,能够兑现对于下载职责的调整。

  • 在起来下载后,当点击打消后,会发送广播到DownlaodReceiver,当接受到那几个广播后,会调用DownloadManager.remove(downloadIds),而DownloadManager.remove()方法规会调用DownloadProvider.delete去删除记录职分。同期会凭借rowId移除该线程调治。

  • 职责完成时,会发送一个广播,通告下载达成,可是此地相比较古怪的是,下载实现的播音发送是身处DownloadInfo中调用DownloadInfo.sendIntentIfRequested()发送的,
    而不是在DownloadThread中。

  • 停顿,比较离奇的是,DownloadManager的异步下载线程提供了断点下载的法力,写入文件也会检讨职务的下载状态是还是不是制动踏板,然而,却从不提供暂停下载任务的API方法,同期它的下载状态查询的不二等秘书诀也是私人商品房类型的。借使急需暂停任务就需求自定义自身的下载义务了。

Cling 源码深入分析

Cling 类库是由 Java 完成的 DLNA/UPnP 左券栈。基于 DLNA/UPnP
能够支付出近似多屏互动、财富共享、远程序调整制等效果的运用,通过 Android
应用管理多个或五个设备,将音频、摄像、图片推送到钦赐设备展现。UPnP
的行事进度大致分为 6
个步骤:寻址(Addressing)、开掘(Discovery)、描述(Description)、调整(Control)、事件
(伊芙nting)、表现(Presentation)。

DownloadThread中的断点下载的落到实处格局

实在在DownloadThread中,首要的下载格局正是就是线程中的excuteDownload()方法。部分尤为重要代码如下:

private void executeDownload() throws StopRequestException {
  final boolean resuming = mInfoDelta.mCurrentBytes != 0;
  ...
  int redirectionCount = 0;
  while (redirectionCount++ < Constants.MAX_REDIRECTS) {
      ......
      conn = (HttpURLConnection) mNetwork.openConnection(url);
      addRequestHeaders(conn, resuming);
      final int responseCode = conn.getResponseCode();
      switch (responseCode) {
          case HTTP_OK:
              if (resuming) {
                  throw new StopRequestException(
                          STATUS_CANNOT_RESUME, "Expected partial, but received OK");
              }
              parseOkHeaders(conn);
              transferData(conn);
              return;
          case HTTP_PARTIAL:
              if (!resuming) {
                  throw new StopRequestException(
                          STATUS_CANNOT_RESUME, "Expected OK, but received partial");
              }
              transferData(conn);
              return;
          ......
      }
      ......
  }
}

在addRequestHeaders()方法中,要是从数据库中获悉的多少已读取写入文件的字节数不为0,则会在央求头前增添三个rangeconn.addRequestProperty("Range", "bytes=" + mInfoDelta.mCurrentBytes + "-");,当添加上此央浼头后,当求求成功后,服务器会回去HTTP_PARTIAL,将收受到的数量通过transferData()方法写入到文件中。在写入文件中时,DownloadThread引进了android.drm.DrmManagerClient与android.drm.DrmOutputStream,那五个包位于framework/base/core/drm包下,部分引用代码如下所示:

if (DownloadDrmHelper.isDrmConvertNeeded(mInfoDelta.mMimeType)) {
  drmClient = new DrmManagerClient(mContext);
  out = new DrmOutputStream(drmClient, outPfd, mInfoDelta.mMimeType);
} else {
  out = new ParcelFileDescriptor.AutoCloseOutputStream(outPfd);
}

对于那多少个类的引进,近年来还不是特意领悟,后续商讨后会进一步扩充剖判

末段丧心病狂的协和画个图,轻松总结下DownloadManager的职业流程:全部外源应用层通过FrameWork层DownloadManager
API调用到DownloadProvider,通过操作数据库,最终经过DownloadService中的线程调节完毕专门的学问。全部上都以由DownloadProvider实行对接调用。而数据库与Service都通过DownloadProvider进行隔开。

图片 27

轻巧易行结构图

DownloadManager中的深入分析当前就先告一段落,文中如有深入分析错误或描述不理解之处,请大家留言提议~:)

BaseAdapterHelper 源码分析

base-adapter-helper 是对古板的 BaseAdapter ViewHolder
格局的多个包装。重要意义就是简化我们书写 AbsListView 的 Adapter
的代码,如 ListView,GridView。优点 (1) 提供 QucikAdapter,省去类似
getCount() 等华而不实函数的书写,只需关切 Model 到 View 的展现。(2)
Base艾达pterHelper 中封装了大量用于为 View 操作的帮衬方法。

Side Menu.Android 源码剖判

Yalantis 开源动画体验很棒的 Side Menu,菜单展开为翻页效果。

DiscreteSeekBar 源码分析

DiscreteSeekBar 实现了近乎 Material Design 风格的
SeekBar。DiscreteSeekBar 能够在 2.1 以上的行使中选拔,可以在 XML
中布置显示的格式,也得以在代码中自定义显示的数字照旧钦命突显字符。使用格局类似
SeekBar,很简单。

CalendarListView 源码深入分析

CalendarListview 是贰个能够实惠从日历中选用日期的控件,帮助到 API 10
以上,只必要在你的布局中增添 DayPickerView 就能够。使用控件 RecycleView
完毕的日子选取器,能够选取时间段。

PagerSlidingTabStrip 源码深入分析

PagerSlidingTabStrip 是非常 ViewPager 使用的 Indicator,辅助 ViewPager
Scroll 时 Indicator 联合浮动。PagerSlidingTabStrip 完成联合浮动功用的规律是调用
ViewPager 的 OnPageChangeListener。 不过 Viewpager 注册的 Listener
不是自己的 OnPageChangeListener,而是 PagerSlidingTabStrip 内部类
PageListener。 通过 PageListener 达成对 ViewPager 和 Tab
的包裹。进而达成滑动联合浮动作效果应。

公家本领点之 Android 动画基础

简单的介绍了 View 和 Property
动画的概念,如何在档期的顺序中创立资源文件,以及如何在代码中使用它们。

国有技艺点之 Java 反射 Reflection

介绍了Java 反射,怎样通过反射获取类、属性、方法、父类、接口、注明等等。

Volley 源码分析

Volley 是 谷歌 在 贰零壹叁 I/O 大会上推出的 Android
异步网络乞求框架和图片加载框架。特别契合数据量小,通讯频仍的网络操作。Volley
重假设经过二种 Diapatch Thread 不断从 RequestQueue
中抽出需要,依照是或不是已缓存调用 Cache 或 Network
这两类数据得到接口之一,从内部存款和储蓄器缓存或是服务器猎取央求的数目,然后交由
ResponseDelivery 去做结果分发及回调解和管理理。

Android Universal Image Loader 源码深入分析

Universal Image Loader 是五个有力的、可中度定制的图纸缓存。整个库分为
ImageLoaderEngine,Cache及
ImageDownloader,ImageDecoder,BitmapDisplayer,BitmapProcessor
中国共产党第五次全国代表大会模块,在那之中 Cache 分为 MemoryCache 和 DiskCache 两有个别。一言以蔽之就是ImageLoader 收到加载及展现图片的职务,并将它交给
ImageLoaderEngine,ImageLoaderEngine
分发任务到具体线程池去推行,职责通过 Cache 及 ImageDownloader
获取图片,中间恐怕由此 BitmapProcessor 和 ImageDecoder 拍卖,最后转换为
Bitmap 交给 BitmapDisplayer 在 ImageAware 中展现。

Dagger 源码分析

Dagger 是一款 Java 平台的依赖性注入库。Java 的信赖性注入库中,最资深的应当属
Google 的 Guice,Spring 也很著名,不过是小心于 J2EE 开拓。Guice
的功能特别强大,但它是由此在运营时读取申明来贯彻凭仗注入的,信赖的变动和注入须求依据Java 的反光机制,那对于对品质特别敏感的 Android
来讲是叁个硬伤。基于此,Dagger 应时而生。Dagger
同样选择申明来兑现依赖注入,但它利用 APT(Annotation Process Tool)
在编写翻译时生成帮忙类,那几个类承继特定父类或促成特定接口,程序在运作时
Dagger 加载那些援助类,调用相招待口完结信赖生成和注入。Dagger
对于程序的习性影响十分小,由此更进一竿适用于 Android 应用的开支。

伊芙ntBus 源码剖判

EventBus 是三个 Android 事件发布/订阅框架,通过解耦公布者和订阅者简化
Android
事件传递,这里的事件可以领略为音信,本文中联合称为事件。事件传递既可用以
Android
四大组件间通信,也足以顾客异步线程和主线程间通信等等。守旧的风云传递格局包蕴:Handler、BroadCastReceiver、
Interface 回调,相比较之下 伊芙ntBus
的优点是代码简洁,使用简单,并将事件发布和订阅充裕解耦。

xUtils 源码深入分析

xUtils一个 Android 公共库,重要归纳 View,DB, Http, Bitmap
两个模块。View 模块首要的效能是通过注脚绑定 UI,财富,事件。DB
模块是五个数据库 ORM 框架, 轻松的言辞就能够展开数据的操作。Http
模块首要拜候互联网,协理同步,异步方式的乞请,帮忙文件的下载。Bitmap
模块是加载图片以及图片的管理,
支持加载本地,网络图片,而且援救图片的内部存款和储蓄器和地面缓存。

ViewPagerindicator 源码深入分析

ViewPagerIndicator 常用语 ViewPager
的分界面导航。主要特点:使用简易、样式全、易扩张。该品种总体规划设计极度轻易,叁个PageIndicator
接口类,具体样式的导航类实现该接口,然后依据现实样式去贯彻相应的逻辑。
IcsLinearLayout:LinearLayout 的恢宏,协助了 4.0 以上的 divider 性格。
CirclePageIndicator、LinePageIndicator、UnderlinePageIndicator、
TitlePagerIndicator 承袭自 View。TabPageIndicator、IconPageIndicator
承继自 HorizontalScrollView。

HoloGraphLibrary 源码分析

HoloGraphLibrary
是三个可用于绘制图表的类型,协理绘制线状图、柱状图、饼状图。图形设计本身,使用方便。可是库本人代码平时,建议吸取规律重构而并不是一向运用。

CircularFloatingActionMenu 源码深入分析

CircularFloatingActionMenu 是三个与老牌应用 Path
菜单类似的(非完全)圆形弹出美食做法。可惠及的定制菜单以及动画。协助自定义动画、菜单、角度范围、半径等。源码主要分为两有的,一部分是构成菜单的
View 部分,另一局地是动画的操作类。

PhotoView 源码分析

PhotoView 是帮忙双击或双指缩放的 ImageView。支持 Pinch
手势自由缩放,帮助双击放大/还原,援助平滑滚动,在滑行父控件下能够运营杰出,协助基于
Matrix 变化(放大/减弱/移动)的风浪监听。PhotoView
那几个库实际上相比较轻便,关键点其实便是 Touch 事件管理和 Matrix
图形调换的施用。

Android Lock Pattern 源码深入分析

Lock Pattern 是 Android 的美术密码解锁库,通过手势连接 3 * 3
的点矩阵绘制图案表示解锁密码。援助ACTION_CREATE_PATTERN、ACTION_COMPARE_PATTERN、ACTION_VERIFY_CAPTCHA
三种 Action 操作方式。

公物本领点之 Java 动态代理

在少数情形下,大家不愿意可能无法平素访谈对象 A,而是通过拜望贰在那之中介对象
B,由 B 去做客 A 达成目标,这种办法大家就叫做代理。这里对象 A
所属类大家誉为委托类,也称为被代理类,对象 B
所属类称为代理类。依照程序运营前代理类是不是业已存在,能够将代理分为静态代理和动态代理。

国有本领点之 Java 表明 Annotation

解说指能够增添到 Java
源代码的语法元数据。类、方法、变量、参数、包都能够被解说,可用来将音讯元数据与程序成分进行关联。Annotation
粤语常译为“证明”,表明的主要职能包含 a. 标识,用于告诉编写翻译器一些音信。b.
编写翻译时动态管理,如动态变化代码。c. 运营时动态管理,如获得表明消息。

公共技巧点之 View 绘制流程

当 Activity 接收到难点的时候,它会被呼吁绘制布局,该诉求由 Android
framework 管理.绘制是从根节点开头,对布局树进行 measure 和 draw 。整个
View 树的绘图流程在 ViewRoot.java类的performTraversals()
函数张开,该函数所做的行事可粗略轮廓为是或不是需求再度总计视图大小(measure)、是或不是供给重新安放视图的任务(layout)、以及是还是不是须要重绘
(draw)。

集体本事点之注重注入

比如在 Class A 中,有 Class B 的实例,则称 Class A 对 Class B
有三个借助。非本身主动初叶化正视,而透过外界来传播重视的方法,我们就称为正视注入。简单来讲正视注入主要有多个低价:(1).
解耦,将借助之间解耦。(2). 因为已经解耦,所以方便做单元测量试验,尤其是 Mock
测验。

集体技术点之 View 事件传递

具有 Touch 事件都被卷入成了 Motion伊夫nt 对象,满含 Touch
的任务、时间、历史记录以及第多少个手指(多指触摸)等。事件类型分为
ACTION_DOWN, ACTION_UP, ACTION_MOVE, ACTION_POINTER_DOWN,
ACTION_POINTER_UP, ACTION_CANCEL,各个事件都以以 ACTION_DOWN
开始,ACTION_UP
甘休。对事件的管理包含三类,分别为传送——dispatchTouchEvent()
函数、拦截——onInterceptTouch伊芙nt() 函数、花费——onTouch伊芙nt() 函数和
OnTouchListener。

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图