
android技术总结
文章平均质量分 88
爱吃水蜜桃的奥特曼
just code it
展开
-
kotlin标准库<一> - Collections
该文章同步更新到稀土掘金链接前言Kotlin标准库提供了一套全面的工具来管理集合。Java、Python其实也提供了类似的集合,用于管理维护相同类型的多个元素。我们看下官方提供的集合接口类图:List和Set继承于Collection,而Collection实现了Iterable接口,因此List和Set都支持迭代器遍历尽管Map没有实现Iterable接口,但是也可以使用迭代器遍历。这是为什么呢?接下来通过基本使用从几个维度分析Collections为我们提供了哪些集合操作。集合的构造方原创 2022-01-27 09:05:19 · 1264 阅读 · 0 评论 -
kotlin - data class使用详解
该文章同步更新到稀土掘金链接前言我们经常创建一些只保存数据的类。 在这些类中,一些标准函数往往是从数据机械推导而来的。在 Kotlin 中,这叫做数据类,并标记为data。定义这些类时,编译器为我们做了什么?自动生成了什么内容?我们可以通过使用,并反编译成java代码进行分析。工具Android Studio或Intellij都为我们提供了将kt转java的功能,这里介绍下as上边的用法:点击 Show Kotlin Bytecode 后,会出现 Kotlin Bytecode的窗口:这里可原创 2022-01-25 14:27:39 · 11954 阅读 · 0 评论 -
Android LiveData原理分析
该文章同步更新到稀土掘金链接前言官方介绍:LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。它有以下的优势:确保界面符合数据状态不会发生内存泄露不会因Activity停止而导致崩溃不再需要手动处理生命周期数据始终保持最新状态适当的配置修改共享资源接下原创 2022-01-24 14:15:23 · 1739 阅读 · 0 评论 -
Android组件化基础
注:该文章也同步发布到稀土掘金:链接前言公司包含三大业务线,每条业务线都有独立的app。功能模块难免会有重合~举个栗子,直播功能本来只在业务线A使用,但是由于业务拓展,现在业务线B和C也需要使用直播功能。这时候就有必要将直播功能做成一个独立的直播组件供三条业务线使用。构思既然要将直播做成组件,需要考虑哪些方面呢?既可独立运行,单独测试该组件功能;也可作为sdk,被其他项目使用统一管理:部署到私有化仓库,其他项目可配置引用基础实践全局控制配置在gradle.properties中的配置可原创 2021-12-08 10:55:38 · 530 阅读 · 0 评论 -
ViewPager2的使用:基本使用、源码分析、多种切换动画
注:该文章也同步发布到稀土掘金:链接前言ViewPager2是ViewPager的改进版本,提供了一些增强功能:垂直方向的支持可动态修改Fragment集合从右到左支持当然,这是官方新推的库,后续会获得更好的支持~这篇文章主要从基本使用、增强功能使用、viewpager到viewpager2的升级、通过ViewPager2.PageTransformer实现多种切换动画等几个方面进行介绍。使用基本使用引入viewpager2库// module的build.gradle文件im原创 2021-12-07 16:14:37 · 5758 阅读 · 2 评论 -
使用MotionLayout高仿华为运动健康我的页面
注:该文章也同步更新到稀土掘金:链接前言在上一篇文章中,主要讲解了CollapsingToolbarLayout配合AppBarLayout使用实现了折叠标题栏效果。这篇文章,再增加点效果:通过使用MotionLayout搭配AppBarLayout,除了实现标题栏的折叠效果,还支持标题栏内的子view平滑移动,让整个交互更加舒适~不多说,这里先上效果图:实现先分析下效果:用户头像和姓名会随着滚动,不断的移动~当appbar全部隐藏后,两个view会保留在左上角背景图片会随着滚动不断的往上原创 2021-12-03 15:55:49 · 2251 阅读 · 0 评论 -
使用CollapsingToolbarLayout高仿稀土掘金个人中心页
注:该文章也同步更新到稀土掘金:链接前言CollapsingToolbarLayout是android MaterialDeign提供的一个组件,通过搭配AppBarLayout可实现toolbar的折叠效果。下边就通过仿实现稀土掘金个人中心页来讲解它的具体用法。先上效果图:实现我们将toolbar分为两层:红色圈中的大模块,暂名:A绿色圈中的模块,暂名:B通过分层再分析下效果:当视图向上滚动时,A会逐渐折叠当A完全折叠后,B的图标会更新状态,并且用户的信息会向上浮动显示在B中原创 2021-12-02 16:56:55 · 2489 阅读 · 0 评论 -
android不同版本的gradle发布内容到Maven仓库
注:该文章也同步更新到稀土掘金:链接前言通常,一些基础功能组件、业务组件会被多个项目组使用。因此,我们有必要将其发布到私有的maven库,方便不同的项目组进行引用。由于gradle的不断升级,每个版本对于发布到maven私有库的方式有所不同。接下来主要将Gradle7.0作为边界进行分别说明。具体使用Gradle6.x及以下版本的使用apply plugin: 'maven' uploadArchives { repositories { mavenDeployer原创 2021-12-01 09:29:32 · 1143 阅读 · 0 评论 -
Jetpack-CameraX的使用:预览、前后摄像头切换、拍照
注:该文章也同步更新到稀土掘金前言官方介绍:CameraX 是 Jetpack 的新增库。利用该库,可以更轻松地向应用添加相机功能。该库提供了很多兼容性修复程序和权宜解决方法,有助于在众多设备上打造一致的开发者体验。一相机功能的开发使用向来是个麻烦事,涉及到各种设备的适配问题,需要在代码中添加一堆的设备专属代码。官方也可能意识到这个问题,camerax正是为了简化开发工作而推出来的库。声称:借助 CameraX,开发者只需两行代码就能实现与预安装的相机应用相同的相机体验和功能。这里先上效果图:原创 2021-11-30 13:56:58 · 3285 阅读 · 1 评论 -
Loop、Handler、MessageQueue和Message源码分析
Handler先看Handler构造函数// 默认构造函数,内部调用了带有两个参数的构造函数public Handler() { this(null, false);}public Handler(Callback callback, boolean async) { if (FIND_POTENTIAL_LEAKS) { final Class<? extend原创 2016-10-26 14:00:27 · 641 阅读 · 0 评论 -
Dialog源码分析
构造函数入手public Dialog(Context context) { this(context, 0, true);}public Dialog(Context context, int theme) { this(context, theme, true);}Dialog(Context context, int theme, boolean createContext原创 2016-11-01 15:11:55 · 515 阅读 · 0 评论 -
AlertDialog源码分析
构造方法protected AlertDialog(Context context) { this(context, resolveDialogTheme(context, 0), true);}protected AlertDialog(Context context, int theme) { this(context, theme, true);}AlertDialog(C原创 2016-11-01 17:56:50 · 579 阅读 · 0 评论 -
Linux下配置Jenkins+Android+Ant自动化构建环境(一)
JDK配置下载地址jdk-linux 安装步骤将使用jdk-8u65-linux-x64.tar.gz版,解压到/usr/: tar -xzvf jdk-8u65-linux-x64.gz在/etc/profile文件中配置环境变量,使用vim编辑// 需要root用户sudo vim /etc/profile编辑文件,在最后添加:export JAVA_HOME=/usr/jdk原创 2017-01-05 16:52:38 · 1728 阅读 · 0 评论 -
Linux下配置Jenkins+Android自动化构建环境(二)
项目基本配置 点击新建,创建一个新的构建项目 选择创建的项目风格,点击ok后,进入到具体的构建配置 填写项目名称,项目描述源码管理jenkins本身支持了几种常用的源码管理工具:svn,git,cvs等;这里的配置采用的是svn,其他的工具类似 配置完成后,在项目的构建过程中,会自动的同步代码,再进行构建 通过Add添加svn对应的帐号密码信息 在添加后,就可以在选项中看到填写的相原创 2017-01-05 17:51:40 · 2529 阅读 · 0 评论 -
使用Android Studio进行NDK开发和调试(gradle-experimental的使用)
在之前的一篇文章有介绍了Android的NDK开发的简单流程,假如这块还没有实践过,建议先去看看这篇文章,把整个流程搞懂,有助于这篇文章的学习Windows环境下Android Studio进行NDK开发 这里我主要讲述如何配置环境,使得我们可以对JNI中的C代码进行调试。关于整体的说明,在下篇文章将会通过翻译官方提供的文档进行阐述环境的配置配置根目录的build.gradle文件bui原创 2016-12-16 15:21:07 · 2680 阅读 · 0 评论 -
使用Android Studio进行NDK开发和调试(gradle-experimental之官方文档的翻译说明)
版本更新版本更新的信息可以通过以下路径进行获取 gradle-experimental版本更新环境要求Gradle(参照三里边的版本要求)Android NDK r10eBuild Tool在19.0.0以上的SDKGradle版本要求不同版本的Experimental Plugin需要不同版本的gradle 配置文件的更新 从传统的Android Gradle Plugi翻译 2016-12-19 11:40:31 · 3944 阅读 · 0 评论 -
AsyncTask源码分析
分析思路从execute()方法开始分析public final AsyncTask<Params, Progress, Result> execute(Params... params) { return executeOnExecutor(sDefaultExecutor, params);}看到execute()方法接受可变参数,最多可接受三个参数;内部调用了executeOnExe原创 2016-10-26 15:39:42 · 363 阅读 · 0 评论 -
ContentService源码分析
简单介绍ContentProvider按照一定规则暴露自己的接口给其它应用来访问自己应用的数据(其实就是自定义增删改查接口并暴露出去,让别的应用访问自己的数据)。当其他应用需要用到该应用的数据时,可以使用ContentResolver,而通过ContentResolver我们可以完成两大功能: 1 通过其对ContentProvider中的数据进行添加、删除、修改和查询操作 2 通过其来监听原创 2016-11-07 08:56:31 · 927 阅读 · 0 评论 -
Android中WebView与JS的交互
上家公司的主打产品是一个游戏社交类应用,里边有一套用户等级系统和一套付费系统。由于这个两套系统的界面不是固定的,而且支持的状态也根据用户的等级而有所不同,有时还需要根据节日或者当前推广的内容进行动态的调整。所以采用了webview加载页面的方式来实现。当然就免除不了会有Android原生方法与JS方法互相调用的情况。这里通过一个简单的例子阐述互调的实现方法,还有注意事项。实现1 定义一个提供方法给原创 2016-07-22 16:58:31 · 405 阅读 · 0 评论 -
华为手机不兼容URI的使用问题
公司最近开展一个新的项目,需要加上版本自动更新的功能。在新版本上线时,有公司的外派同事反馈说在更新时,会直接奔溃。通过不断的查找发现,只有在华为部分手机出现了类似的问题(Mate8,P9都会)。这里把问题记录下 分析与解决1 情形自动更新使用了系统提供的DownloadManager,当下载完成时,通过广播机制对下载完成事件进行广播,action为DownloadManager.ACTION_DO原创 2016-07-23 22:45:34 · 5712 阅读 · 0 评论 -
二维码识别开源项目zxing的使用和源码分析
引言 最近公司需要用到二维码扫描识别的功能,回去翻看以前的使用,发现搞了很久都没有弄明白。上网搜索更是一堆杂乱的信息,很难去抽离自己需要的信息。于是,狠下心来跟着调用的思路,一步一步的分析源码。最后有种豁然开朗的感觉,哈哈用法1.1 添加core-3.0.0.jar1.2 配置权限<uses-permission android:name="android.permission.CAMERA原创 2016-07-01 22:18:44 · 12163 阅读 · 4 评论 -
通过DecorView实现app全局activity右滑退出
在公司项目中使用了一个侧滑的开源项目com.jeremyfeinstein.slidingmenu.lib,一直没有时间研究,只是知道大概的用法。但“会用”一直不是我最终的追求!于是趁着项目刚上线的空档期,好好的看了下它的源码。搞懂了它的原理,为我对app全局activity右滑退出的实现提供了一个很好的思路。1 侧滑项目的源码1.1 创建过程public Slid...原创 2016-07-02 20:40:43 · 1107 阅读 · 0 评论 -
Android使用SVG实现今日头条下拉刷新动画
1 SVG的全称是Scalable Vector Graphics,叫可缩放矢量图形。它和位图(Bitmap)相对,SVG不会像位图一样因为缩放而让图片质量下降。 2 Android L开始提供了新的API VectorDrawable 可以使用SVG(矢量图)类型的资源,在xml文件中的标签是vector。但想要好好的感受下SVG的使用,除了需要5.0之后的系统支持外,还需要使用Andr原创 2016-07-26 21:54:08 · 4108 阅读 · 0 评论 -
Windows环境下Android Studio进行NDK开发
Android Studio对Ndk的支持正在不断的完善。之前有试过写demo,成功运行了。但整个过程遇到了不少的问题,而且网上搜集到的问题答案各种各样,大部分都是互相复制粘贴,没有自己的思路。今天趁着放假,把自己实现过程记录下来项目结构图1 NDK配置1.1 首先需要到官网下载NDK,我下边的例子采用的是android-ndk-r10b。1.2 将下载的文件解压到一个目录(目录可自由选择),在环原创 2016-07-17 14:49:44 · 1121 阅读 · 1 评论 -
Android进程间通信-AIDL的简单使用
AIDL:Android Interface Definition Language,即Android接口定义语言,用于生成可以在Android设备上两个进程之间进行进程间通信(IPC)的代码。下边从服务端和客户端两个方面来介绍使用AIDL来进行进程间通信的流程(以eclipse为开发工具,AS开发总的流程和原理也是一致的,但为了更好理解,加以说明)服务端1 创建一个aidl文件夹(可选),在该文原创 2016-07-18 22:43:25 · 617 阅读 · 0 评论 -
android的aidl-手动实现aidl自动生成的Java文件
为了简化我们实现Binder进程间通信的繁琐步骤,系统提供了AIDL文件,编译通过即可生成对应的java文件。承接上篇文章Android进程间通信-AIDL的简单使用 ,这里手动实现aidl自动生成的aidl文件,便于我们进一步理解内部的一些逻辑。实现步骤1 定义一个IOperation接口,并在内部声明一个供客户端跨进程调用的方法,并使该接口继承IInterface接口。public inter原创 2016-07-21 21:55:30 · 6153 阅读 · 0 评论 -
Android仿UC浏览器切换网页背景色
平时会喜欢看下Android开发技术周报里边的文章学习下,这个网页做的不错,每周更新不少干货上去,很值得一看。因为每次都需要用浏览器去看,对我个人喜欢坐车看书的人来说,体验不算好。于是,自己鼓捣了个app,主要就是将这个网站的资源整合,然后重新排版了。已经上了豌豆荚,欢迎大家点击下载下载地址 考虑到有些人喜欢熄灯后躺在床上继续学习(额,其实这个习惯不好。。。),所以在app中增加了一个夜间原创 2016-08-31 14:14:17 · 1427 阅读 · 0 评论 -
SystemServer源码分析
从SystemServer的main函数入手/** * The main entry point from zygote. */public static void main(String[] args) { new SystemServer().run();}这里创建了一个SystemServer并调用了它的run()函数,进入run()函数,这个方法内部比较多,分段分析:时间处理原创 2016-11-03 18:04:50 · 2438 阅读 · 0 评论 -
Binder-基础知识和AIDL
Binder框架 提供了服务端接口、Binder驱动、客户端接口三个模块 - 服务端:一个Binder类的对象,该对象一旦创建,会创建一条隐藏的线程。该线程会接收Binder驱动发送的消息,收到消息后,会执行Binder对象中的onTransact()函数 - Binder驱动:任意一个服务端Binder对象被创建后,同时会在Binder驱动中创建一个mRemote对象,该对象的类型原创 2016-10-25 17:31:13 · 371 阅读 · 0 评论 -
Binder-系统服务和ServiceManager
系统服务分析1 获取系统服务@Overridepublic Object getSystemService(String name) { return SystemServiceRegistry.getSystemService(this, name);}内部是调用了SystemServiceRegistry.getSystemService(this, name);,那我们进入其g原创 2016-10-26 09:56:04 · 535 阅读 · 0 评论