![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android
文章平均质量分 84
_龙衣
想到就去做,万一实现了。
展开
-
Android - EventBus 最最最基本使用
背景在Android开发中数据传递的方式有很多种,常见的有Intent在页面间传递数据Handler刷新UIBroadcast传递消息系统提供的API在使用上会有些复杂。举个示例:Handler发送数据并刷新UIHandler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg);原创 2021-01-24 19:59:39 · 1319 阅读 · 0 评论 -
Android - 从浅到懂理解 Serializeable 和 Parcelable 实现的序列化和反序列化
背景在开发插件化App时用到了AIDL实现进程间通信。而AIDL要想传递对象类型的数据就需要将对象序列化。在 Android 开发中,我们经常需要对对象进行序列化与反序列化操作。最常见的就是通过 Intent 传输数据时,Intent 只能传输基本数据类型、String 类型和可序列化与反序列化的对象类型,要想通过 Intent 传递对象类型,我们需要让该对象类型支持序列化和反序列化。我们知道,Android 给我们提供了两种方式来完成序列化与反序列化过程:一种是 Serializable 方原创 2020-12-23 22:09:35 · 666 阅读 · 0 评论 -
Android - 秒懂TCP_UDP_IP_Socket
背景在涉及网络知识时总是记不太清相关概念,因此期望通过简短的文字描述,理解并记住相关概念。TCP属于七层协议中的传输层,是面向连接的协议。面向连接意思就是通信双方建立连接才能通信,没建立连接不能通信。因此是安全的。安全可以指:能够知道通信双方,也可以指数据能够保证按顺序收到。UDP属于七层协议中的传输层,是面向无连接的协议。面向无连接意思就是通信之前双方不需要建立连接。这也导致数据可能丢包并且不能保证数据接收的顺序。数据丢包的原因是:客户端发送消息了,但是服务器端还没启动,因此收不到客户原创 2020-12-13 09:55:40 · 189 阅读 · 0 评论 -
Android - 秒懂TCP连接的三次握手、四次挥手
背景在涉及网络知识时总是记不太清相关概念,因此期望通过简短的文字描述,理解并记住相关概念。定义Http 协议是在 TCP 协议基础上封装的应用层协议。所以它在建立连接的时候会经历三次握手,断开连接会经历四次挥手。相关标识SYN 表示建立连接,FIN 表示关闭连接,ACK 表示响应,PSH 表示有 DATA数据传输,RST 表示连接重置。三次握手目的是为了通信双方建立连接。第 1 次握手客户端发送连接标识 SYN 给服务器端第 2 次握手服务器端接收到消息,返回 ACK+SYN原创 2020-12-13 09:54:18 · 610 阅读 · 1 评论 -
Android - 从浅到懂去理解注解
文章目录Java注解产生背景Java 注解是什么作用是什么编译时注解运行时注解二者的区别本质是什么注解的分类预定义注解@Override@Deprecated@SuppressWarnings@SafeVarargs@FunctionInterface元注解@Target@Retention@Documented@Inherited自定义注解注解使用示例1. @NonNull2. 代替简单枚举3. Butterknife @BindView 实现4. AopArms 项目源码其他问题注释和注解的区别注解是原创 2020-12-09 09:18:59 · 305 阅读 · 0 评论 -
Android -从浅到懂使用反射机制
定义JAVA反射机制是在运行状态中,对于任何一个类,都能够知道这个类的所有属性和方法;对于任何一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的反射机制。使用场景反射是在运行时获取确定类型,绑定对象。常见的两个使用场景运行时获取对象的所有信息泛型擦除在运行时获取类这里的运行时指的是程序在运行后。相应的还有编译时,编译时是编译器将源代码翻译成机器能识别的代码。举个例子说明编译时和运行时的区别:微信图片list1 没有声明原创 2020-12-09 09:17:32 · 5747 阅读 · 10 评论 -
Android - 带着问题看源码之 LiveData
定义LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力.意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。 这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。如果观察者(由 Observer 类表示)的生命周期处于 STARTED 或 RESUMED 状态,则 LiveData 会认为该观察者处于活跃状态。我想从源码知道些什么内容数据如何感知生命周期?T原创 2020-11-21 16:50:23 · 653 阅读 · 0 评论 -
Android - 带着问题看源码之 Lifecycle
我想从源码知道些什么内容如何实现其它对象观察组件(Activity/Fragment)的生命周期状态?在其它对象中观察到组件(Activity/Fragment)的生命周期我们可以做哪些事情?Tip:源码:Android API 29LifeCycle 的使用// 定义生命周期观察者class MyLocationListener implements LifecycleObserver { public MyLocationListener(Context context,原创 2020-11-21 16:47:44 · 284 阅读 · 0 评论 -
Android - 带着问题看源码之 ViewModel
通过源码我们能知道些什么内容生命周期比组件的长如何实现?数据在发生屏幕旋转等配置更改时如何保存数据?(注意是配置文件更改而不是所有的activity销毁都保存数据)为什么能避免内存泄漏?为什么不同的Fragment使用相同的Activity对象来获取ViewModel,可以轻易的实现ViewModel共享?Tip:源码:Android API 29ViewModel 的使用根据 sunFlower示例,我们写个简单的示例demo如下:class GardenActivity : App原创 2020-10-27 19:42:27 · 683 阅读 · 1 评论 -
Android-在 ViewModel 中使用 AutoDispose2 解决 RxJava 的内存泄露问题
RxJava 的内存泄露问题runRxLambda 和 runRxLambdaViewModel 只是个扩展函数,可以不用理会,下面两段代码唯一的区别就是第二段增加了 AndroidLifecycleScopeProvider.from(view),这也导致了第二段代码不会出现内存泄露,而第一段代码会出现内存泄露。runRxLambda(Observable.intervalRange(0,100,1,1,TimeUnit.SECONDS),{ Log.e("222","ru原创 2020-10-15 22:03:10 · 2022 阅读 · 0 评论 -
Android-使用 RxJava2 封装 RxBus
实现内容来源网络,链接忘记了,侵权删。object RxBus { private val TAG = javaClass.simpleName /** * 用于保存RxBus事件的所有订阅,并在需要时正确的取消订阅。 */ private val disposablesMap: HashMap<Any, CompositeDisposable?> by lazy { HashMap<Any, CompositeDisp原创 2020-10-02 19:27:25 · 757 阅读 · 1 评论 -
设计模式-通过微信公众号示例讲解观察者模式
实例微信公众号的流程:首先看一下公众号的基础功能:发布文章通知所有人或者是通知部分人删除关注者点击关注(已关注的不能重复关注)然后订阅公众号的读者只需订阅公众号即可当公众号的作者发布内容选择相关的读者之后,订阅公众号的相关读者就能收到消息。实现定义抽象被观察者(微信公众号)定义抽象观察者(具体的微信公众号)定义具体的被观察者(读者)定义具体的观察者(订阅具体微信公众号的读者)观察者订阅被观察者(读者订阅公众号)被观察者发送消息(公众号发送内容)定义抽象被观察者int原创 2020-10-02 19:11:52 · 532 阅读 · 0 评论 -
Android - RxJava2 极简入门
定义RxJava 提供一套异步编程的 API,这套 API 是基于观察者模式的,而且是链式调用的,所以使用 RxJava 编写的代码的逻辑会非常简洁。相关基础观察者模式当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。应用场景示例:微信公众号的订阅功能。观察者模式简单实现TODO使用场景引入依赖implementation 'io.reactivex.rxjava2:rxjava原创 2020-09-24 22:58:39 · 1115 阅读 · 0 评论 -
Android - kotlin 协程极简入门
背景协程的作用是解决并发,并发的常见场景是多线程。“并发”和“并行”经常弄混。下面是我的理解,当然我理解也不一定是对的“并发”是宏观上多个任务同时执行,而微观上任务是同一时间只有一个在执行。而“并行”不管宏观微观都是多个任务在同时执行。举个生活中的例子:“并发”就像是吃饭的时候讲话,微观上同一时间只能是吃饭或者是讲话,是一个人在执行。“并行”就是让一个人吃饭,另一个人去讲话,是两个人去执行。多线程情况下就不可避免的涉及以下的问题:线程什么时候执行结束线程间的相互通信多个线程的管理原创 2020-09-23 21:11:32 · 569 阅读 · 0 评论 -
设计模式-三类工厂模式总结
工厂模式工厂顾名思义就是创建产品,主要作用是解耦。根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。1. 简单工厂模式创建产品接口创建具体工厂类创建工厂,根据类型生产不同的产品Phone类:手机标准规范类(AbstractProduct)public interface Phone { void make();}MiPhone类:制造小米手机(Product1)public class MiPhone原创 2020-08-29 12:18:47 · 312 阅读 · 0 评论 -
Android布局-ConstraintLayout示例
match_parent 问题宽度match_parent,就设置宽度为0dp,再设置左约束和右约束;高度match_parent,就设置高度为0dp,再设置上约束和下约束。控件对齐居中app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constrai原创 2020-08-29 11:41:26 · 546 阅读 · 0 评论 -
Android Jetpack 库架构组件 Room+Paging 基础使用
上篇文章 Android Jetpack 库架构组件 ViewModel+LiveData 基础使用 的示例2中,使用 ViewModel+ LiveData 的方式实现了数据库数据查询并分页显示的效果,而这里的数据库用的就是Room,分页使用的 Paging。Room 是什么Room 持久性库在 SQLite 的基础上提供了一个抽象层,让用户能够在充分利用 SQLite 的强大功能的同时,获享更强健的数据库访问机制。也就是 Room 是在SQlite的基础上封装了接口,使得SQlite更加易.原创 2020-06-29 21:54:30 · 2644 阅读 · 0 评论 -
Android Jetpack 库架构组件 ViewModel+LiveData 基础使用
ViewModel 是什么ViewModel 类旨在以注重生命周期的方式 存储和管理 界面相关的数据。ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存。为什么ViewModel 类中的数据可在发生屏幕旋转等配置更改后继续留存?因为ViewModel的生命周期长于组件(Activity/Fragment)的生命周期下图是左侧给出了Activity 经历屏幕旋转而后结束的过程,所处的各种生命周期状态。而右侧是ViewModel的生命周期。从中可以看出ViewModel的生命周期是长原创 2020-06-29 21:53:19 · 682 阅读 · 0 评论 -
Android Jetpack 库架构组件 Lifecycles 基础使用
背景Android 组件(Activity、Fragment)是有生命周期的,在不同的生命周期方法做不同的操作。比如在onStar做一些初始化的操作,在onStop做些轻量的销毁操作。在使用 MVP架构开发的时候,我们一般会定义一个BasePreserter 来处理业务生命周期方法调用时处理相关操作,但是业务复杂后还是避免不了在组件的生命周期方法中去做处理。常见的是地图的定位和销毁。相信用过百度获取高德地图定位SDK的胖友,对下面的代码绝对熟悉:// 自定义的定位监听类internal class原创 2020-06-29 21:52:12 · 501 阅读 · 0 评论 -
UI Automator(译)
UI Automator是一个UI测试框架,适用于跨系统和已安装应用的跨应用功能UI测试仅支持 Android 4.3 以上的版本UI Automator测试框架提供了一组API,以构建可在用户应用程序和系统应用程序上执行交互的UI测试UI Automator API使您可以执行操作,例如在测试设备中打开“设置”菜单或应用启动器。UI Automator测试框架非常适合编写黑盒式自动化...翻译 2019-09-29 10:51:02 · 457 阅读 · 0 评论 -
自动化 UI 测试(译)
概述用户界面(UI)测试可确保您的应用程序满足其功能要求并达到高质量标准,从而使其更有可能被用户成功采用UI测试的一种方法是简单地让测试人员在目标应用程序上执行一组用户操作,并验证其行为是否正确。但是,这种手动方法可能很耗时,乏味且容易出错。一种更有效的方法是编写UI测试,以便以自动化方式执行用户操作。自动化方法使您能够以可重复的方式快速可靠地运行测试。Note: 强烈建议您使用Andr...翻译 2019-09-29 10:49:24 · 276 阅读 · 0 评论 -
UI Automator 测试多个应用的界面
https://developer.android.google.cn/training/testing/ui-testing/uiautomator-testing测试多个应用的界面通过涉及多个应用程序中用户交互的用户界面(UI)测试,您可以验证当用户流跨入其他应用程序或进入系统UI时,您的应用程序的行为是否正确。这种用户流程的一个示例是消息传递应用程序,该应用程序允许用户输入文本消息,...翻译 2019-10-06 13:40:08 · 464 阅读 · 0 评论 -
两个例子学会策略模式
策略模式意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。如何解决:将这些算法封装成一个一个的类,任意地替换。关键代码:实现同一个接口。应用实例:1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。2、旅行的出游方式,...原创 2019-09-16 21:29:02 · 326 阅读 · 0 评论 -
kotlin 常见的集合操作
集合操作ListList 的默认实现是 ArrayList是一个有序集合,可通过索引(反映元素位置的整数)访问元素val bob = Person("Bob", 31)val people = listOf<Person>(Person("Adam", 20), bob, bob)val people2 = listOf<Person>(Person("Ad...原创 2019-09-16 21:16:58 · 1181 阅读 · 0 评论 -
ToolBar 使用姿势
首发于个人技术博客简单使用 直接使用ToolBar 布局,在ToolBar布局里添加子布局使用前的准备1. 添加依赖compile 'com.android.support:appcompat-v7:25.3.1' 2. 隐藏原有的ActionBar,两步,有可能会出现 Theme.AppCompat 北京找不到,说明你的support库版本太低了,需要去SDK manager 去升级那原创 2017-08-19 23:08:34 · 397 阅读 · 0 评论 -
图片选择器 Matisse 在 6.0 以上手机使用相机以及选择图片过滤小图功能
首发地址:dongxi520.com 需求:实现一个图片选择器,能选择本地图片和拍照拿到需求,第一个想法就是看自己在规定时间上能否又快又好的实现。显然是不能( 。。),现在那么多前辈都把轮子都造好了,我们直接拼装不久可以了吗?目前为止,我还是这样,等功能深厚成为前辈了再撸几个轮子给后辈使用,这些都是后话,先实现这个需求吧。先去GitHub搜索一圈图片选择器,发现知乎开源的Matisse家伙长原创 2017-08-03 21:08:16 · 5682 阅读 · 12 评论 -
Android自定义View以及ViewGroup初探
在Android中,控件大致被分为两类:ViewGroup和View。ViewGroup控件作为父控件管理其包含的View控件。例如LinearLayout下包含着一些TextView,ImageView等View控件。自定义View 适当的使用自定义View可以丰富程序的体验效果,但是滥用View则会带来适得其反的效果。在View中通常有以下一些比较重要的 回调方法onFinishInfla原创 2016-12-07 16:05:41 · 527 阅读 · 0 评论 -
将 so|JNI|NDK 之间的关系说明白
最近在了解公司历史的发展,发现了公司产品中几乎都要使用 so 文件,不禁好奇这个 so 到底是何方神圣。so 文件so 是 shared object 的缩写,见名思义就是共享的对象,机器可以直接运行的二进制代码。so 主要存在于 Unix 和 Linux 系统中。【参考:安卓so文件是什么,又是如何开发出来的呢? 】它是 c/c++ 实现的功能函数集合,并对外提供标准的接口,外层可以...原创 2019-10-27 09:59:34 · 388 阅读 · 0 评论 -
uni-app 常用组件实战
view视图容器文档地址用于包裹其他组件scroll-view可滚动视图区域,使用时需要添加一个固定的高度。文档地址用于包裹其他组件,且在该区域内可以滑动。允许横向,纵向滑动。如果是页面需要实现上拉加载、下拉刷新,推荐使用 页面的滑动加载和下拉刷新缺陷和使用注意适配问题:请勿在 scroll-view 中使用 canvas、textarea、map、...原创 2019-06-17 20:17:28 · 4051 阅读 · 1 评论 -
uni-app 项目结构
项目结构页面结构遵循 VUE 单页面结构只能有一个 template,一个script,可以有多个style<template> // 布局</template><script> export default { // data 必须声明为返回一个初始数据对象的函数;否则页面关闭时,数据不会自动销毁,再次打开该页面时,会显示上次数据 ...原创 2019-06-17 20:19:16 · 3584 阅读 · 0 评论 -
Android-动画-view 动画笔记
最后要实现的动画效果有:旋转,平移,缩放,透明度。主要通过系统自带的ic_launcher_round这张图来演示。 View 动画推荐使用 xml 编写,易于阅读。 View 动画并未改变 View 的真实位置,在 View 需要做交互时需要注意!!!&lt;set&gt;&lt;/set&gt;中属性的含义&lt;?xml version="1.0"原创 2018-06-17 23:02:37 · 286 阅读 · 0 评论 -
Android 开发上手 Kotlin - Lambda
来源 kotlin 实战,业余时间整理的笔记。lambdalambda 本质上就是可以传递给其他函数的一小段代码,也就是可以作为函数参数的一段代码Java 8 之前可以通过 匿名函数 实现,简单例子如下:button.setOnClickListener(new OnClickListener() { @Override public void onClick (View...原创 2019-05-31 22:00:07 · 382 阅读 · 0 评论 -
Android 开发上手 Kotlin - 类、对象、接口
Kotlin 实战随手笔记。类、对象、接口每天都要完成工作任务,但是还是要学点东西。类// 主构造方法class User()class User(val age:Int)// 主构造方法和初始化语句块class User constructor(_nickname: String) { val nickname: String init { nickname = ...原创 2019-05-30 23:39:44 · 367 阅读 · 0 评论 -
Android 开发上手 Kotlin - 集合和函数
这篇文章有点水了,是看的 kotlin 实战第三章顺手记录的笔记。不过说真的老外写的书,逻辑真的很强,特别是从普通写法到扩展函数的写法介绍。处理集合使用 listOf 函数来创建 list:val list = listof("1","2","3")使用 mapOf 函数来创建 map:val map= mapOf(1 to "one", 7 to "seven", 53 to "...原创 2019-05-27 22:57:47 · 204 阅读 · 0 评论 -
Android 开发上手 Kotlin - 基础语法
原本最近的博文应该是写 Flutter-WanAndroid 项目相关的博文的,但是最近在公司一直用 Kotlin 写项目,回到家就懒得写 Flutter 了,之前学的 Flutter 又交回给书本了…(尴尬)。所以最近先把 Kotlin 相关的学习总结写上,Flutter-WanAndroid 项目肯定是会写的,先往后推迟一段时间。文章结构函数声明写法一: fun max(a: I...原创 2019-05-21 23:17:13 · 269 阅读 · 0 评论 -
uni-app 基础语法
data 属性data 必须声明为返回一个初始数据对象的函数;否则页面关闭时,数据不会自动销毁,再次打开该页面时,会显示上次数据。全局变量uni-app 全局变量的几种实现方式公用模板定义一个专用的模块,用来组织和管理这些全局的变量,在需要的页面引入。(个人感觉,推荐使用)示例如下:在 uni-app 项目根目录下创建 common 目录,然后在 common 目录下新...原创 2019-06-17 20:21:14 · 7780 阅读 · 0 评论 -
uni-app 页面传参实战
页面跳转保留当前页面并跳转新页面保留当前页面,跳转到应用内的某个页面,使用 uni.navigateBack可以返回到原页面。例子:跳转到 test 文件夹下的 test 页面uni.navigateTo({ url: '../test/test'});不保留当前页面并跳转新页面关闭当前页面,跳转到应用内的某个页面。例子:跳转到 test 文件夹下的 tes...原创 2019-07-17 21:09:59 · 4244 阅读 · 0 评论 -
uni-app Banner ( 轮播图 ) 实现
BannerBanner 的实现使用的是 swiper 组件实现,在swiper组件里面添加swiper-item组件即可实现例子<view class="page-section-spacing"> <swiper class="swiper" indicator-dots="true" autoplay="true" interval="5000" ...原创 2019-07-17 21:12:12 · 33381 阅读 · 9 评论 -
uni-app下拉刷新、上拉加载更多实现
下拉刷新下拉刷新文档在 js 中定义 onPullDownRefresh 处理函数(和onLoad等生命周期函数同级),监听该页面用户下拉刷新事件。需要在 pages.json 里,找到的当前页面的pages节点,并在 style 选项中开启 enablePullDownRefresh:true。当处理完数据刷新后,uni.stopPullDownRefresh 可以停止当前页面的下拉刷...原创 2019-07-17 21:14:24 · 26395 阅读 · 6 评论 -
Kotlin 单例模式学习
原文博客地址 https://mp.weixin.qq.com/s/GwpqZpyUcOlgAMQZCJM3UQ原文作者:承香墨影无参单例直接使用 kotlin 的 object ,它是依赖类的初始化锁来保证线程安全。类的初始化锁(原文有图文详细介绍):即在 Class 被加载后,且被线程使用之前,JVM 会去获取一个锁。这个锁可以同步多个线程对同一个类的初始化,避免多线程调用时,引...原创 2019-08-13 18:17:07 · 1036 阅读 · 0 评论