自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 资源 (3)
  • 收藏
  • 关注

原创 Android MVC、MVP、MVVM、MVI架构对比及示例

随着Android应用开发技术的不断成熟,应用功能越来越丰富,迭代速度要求的越来越高,应用的开发架构也在不断演进、优化,从MVC、MVP到MVVM,到如今的MVI。谷歌官方也在不断推广、优化适合Android平台的开发架构,并推出了一系列的组件如Jetpack来支撑其架构的演进。但不管架构如何演进,其本质目的就是尽量解耦各模块、各业务之间的依赖,消除样板代码,让开发人员专注于业务开发,快速、高效、高质量完成应用的开发。

2022-11-09 19:14:05 1885 1

原创 Android App内存泄漏原理、检测及修改方案

Android中高级开发人员必备的内存泄露知识

2022-11-05 17:13:10 1629 1

原创 平行世界的桥梁——关于“梦”的胡思乱想

某一天早上醒来,发现做了一个梦,突然很想把这个梦记住,当时还能回想起来主要的内容,但随着时间的推移,记起来的却越来越少,直到完全忘记。然后冒出了一个奇怪的想法:“梦”——平行世界的桥梁。关于平行世界,应该有很多人提出过这种理论,但谁也没有办法去证实,都只是猜想,毕竟我们都生活在这个世界,这个维度里,或许只有跳出这个维度才能知道真相吧。姑且认为平行世界是存在的,而且存在很多的平行世界。每个平行世界都有一个你,过着不同的生活,经历不同的事,遇到不同的人,也可能偶然的遇到和你现在的世界相同的人或事

2022-02-18 12:54:35 361

原创 Jetpack学习之MVVM实战

MVVM架构与JetpackMVVM即Model-View-ViewModel的缩写,它的出现是为了将图形界面与业务逻辑、数据模型进行解耦。MVVM也是Google推崇的一种Android项目架构模型。而Jetpack组件,大部分是为了能更好的架构MVVM应用程序而设计的。Jetpack组件Lifecycle:有了Lifecycle组件,当系统组件Activity、Fragment、Service和Application的生命周期发生变化时,自定义组件能够及时得到通知,使自定义组件与系统组件进一步

2021-04-01 17:12:26 426 2

原创 Jetpack学习之Paging

Paging组件的意义分页加载是在应用程序开发过程种十分常见的需求。分页加载是对数据进行按需加载,在不影响用户体验的同时,还能节省数据流量,提升应用的性能。Paging就是Google为了方便Android开发者完成分页加载而设计的一个组件,它为几种常见的分页机制提供了统一的解决方案。Paging支持3种架构类型:网络对网络数据进行分页加载,是最常见的一种分页需求。Paging组件提供了3种不同的方案,以应对不同的分页机制,分别是PositionalDataSource、PageKeyedDat

2021-03-31 14:48:37 906 1

原创 Jetpack学习之WorkManager

绝大部分应用程序都有在后台执行任务的需求,根据需求的不同,Android为后台任务提供了多种解决方案,如JobScheduler、Loader、Service等。WorkManager为应用程序中那些不需要及时完成的任务提供了一个统一的解决方案,以便在设备电量和用户体验之间达到一个比较好的平衡。WorkManager的3个重要特点:针对的是不需要及时完成的任务保证任务一定会被执行兼容范围广。最低能兼容API Level 14WorkManager的兼容方案:WorkManager能依据设备的

2021-03-29 14:01:51 156

原创 Jetpack学习之DataBinding

DataBinding的优势:项目简洁,可读性高。部分与UI控件相关的代码可以在布局文件中完成。不再需要findViewById()方法。布局文件可以包含简单的业务逻辑。UI控件能够直接与数据模型中的字段绑定,甚至能响应用户的交互。DataBinding和MVVM架构是分不开的,是Google为了Android能够更好的实现MVVM架构而设计的。使用方法在app的build.gradle中启用数据绑定 buildFeatures { dataBinding tru

2021-03-26 16:00:03 230

原创 Jetpack学习之Room

Android采用sqlite作为数据库存储,Room就是Google推出的自己的ORM(Object Relational Mapping)。Room的架构图:Entity:一个Entity对应于数据库中的一张表。Entity类是Sqlite表结构对Java类的映射,在Java中可以被看作一个Model类。Dao:即Data Access Objects,数据访问对象,可以通过它来访问数据。一个Entity代表一张表,而每张表都需要一个Dao对象,用于对表进行增/删/改/查。Room数据库在被

2021-03-23 18:54:25 229 1

原创 Jetpack学习之LiveData

LiveData是一个可被观察的数据容器类。它是一个数据的容器,将数据包装起来,使数据成为被观察者,当该数据发生变化时,观察者能够获得通知。和ViewModel的关系ViewModel用于存放页面所需的各种数据,以及数据相关的业务逻辑,因此其中的数据可能会随着业务的变化而变化。对于页面来说,并不关心ViewModel中的业务逻辑,它只关心需要展示的数据是什么,并且希望在数据发生变化时,能及时得到通知并做出更新。LiveData的作用就是在ViewModel中的数据发生变化时通知页面。使用方法L

2021-03-23 11:34:15 234

原创 Jetpack学习之ViewModel

概念ViewModel是介于View(视图)和Model(数据模型)之间的一个组件,它起到了桥梁的作用,使视图和数据既能够分离开,也能够保持通信。生命周期使用方法在app的build.gradle中添加依赖implementation 'androidx.lifecyle:lifecycle-viewmodel:2.2.0'写一个继承自ViewModel的类import androidx.lifecycle.ViewModelimport java.util.*class T

2021-03-22 14:41:58 126 1

原创 Jetpack学习之Navigation

Jetpack提供了一个名为Navigation的组件,用来管理页面(Actvity和Fragment,以Fragment为主)和App bar。Navigation的优势:可视化的页面导航图,便于理清页面间的关系通过destination和action完成页面间的导航方便添加页面切换动画页面间类型安全的参数传递通过NavigationUI类,对菜单、底部导航、抽屉菜单导航进行统一的管理支持深层链接DeepLinkNavigation的主要元素Navigation Graph。一种新

2021-03-01 14:23:03 241 1

原创 Jetpack学习之Lifecycle

  Jetpack是Google为了解决Android架构问题而引入的,Google官方说的说法:“Jetpack是一套库、工具和指南,可以帮助开发者更轻松地编写应用程序。Jetpack中的组件可以帮助开发者遵循最佳做法、摆脱编写样板代码的工作并简化复杂的任务,以便他们能将精力集中放在业务所需的代码上。”  Jetpack主要包括4个方面,分别是架构(Architecture)、界面(UI)、行为(Behavior)和基础(Foundation)。在项目中的gradle.properties文件中,/

2021-02-26 18:48:37 145

原创 Android的AMS相关知识

Android7.0的AMS相关信息  ActivityManager是一个和AMS相关联的类,它主要对运行中的Activity进行管理,这些管理工作并不是由ActivityManager来处理的,而是交由AMS来处理的。ActivityManager中的方法会通过ActivityManagerNative(AMN)的getDefault方法来得到ActivityManagerProxy(AMP),通过AMP就可以和AMN进行通信,而AMN是一个抽象类,它将功能交由它的子类AMS来处理,因此AMP就是AM

2021-02-24 22:36:03 358 1

原创 理解Android上下文Context

Context使用场景总的来说分为两大类:使用Context调用方法,比如启动Activity、访问资源、调用系统级服务等。调用方法时传入Context,比如弹出Toast、创建Dialog等。  Activity、Service和Application都间接的继承自Context,一个应用进程中有多少个Context,这个数量等于Activity和Service的总个数加1,1指的是Application。Context是一个抽象类,它的内部定义了很多方法及静态常量,具体实现类为Context

2021-02-13 18:21:59 171

原创 ContentProvider的启动过程随笔

query方法到AMS的调用过程  在应用中使用ContentProvider需要先调用getContentResolver方法,此方法在ContextWrapper总,然后调用mBase.getContentResolver,mBase指的是ContextImpl,getContentResolver方法中返回了ApplicationContentResolver类型的mContentResolver对象。ApplicationContentResolver是ContextImpl的静态内部类,继承自.

2021-02-11 16:36:43 266

原创 Android Broadcast注册、发送、接收流程随笔

Broadcast的注册过程  要动态注册广播,需要调用registerReceiver方法,它在ContextWrapper中实现,会调用mBase.registerReceiver方法,mBase具体指向ContextImpl,registerReceiver方法最终会调用registerReceiverInternal方法,如果LoadedApk类型的mPackageInfo不等于null且context不等于null,就通过mPackageInfo的getReceiverDispatcher方法

2021-02-10 17:28:34 301 2

原创 Android Service启动流程随笔

Android启动Service有两种方式,一种是startService,一种是bindService,下面对这两中方式的启动流程进行分析。startService的启动过程ContextImpl到AMS的调用过程

2021-02-09 20:42:21 291

原创 Android应用程序进程启动过程随笔

应用程序进程创建过程的步骤比较多,主要分为两部分,分别是AMS发送启动应用程序进程请求,以及Zygote接收请求并创建应用程序进程AMS发送启动应用程序进程请求欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用

2021-02-09 11:07:52 263

原创 Android系统启动流程随笔

Android系统架构从上到下依次是应用层(System Apps)、应用框架层(Java API Framework)、系统运行库(Native)、硬件抽象层(HAL)、Linux内核层(Linux Kernel)。DVM中的应用每次运行时,字节码都需要通过即时编译器(Just In Time,JIT)转换为机器码,这会使得应用的运行效率降低。在ART中,系统在安装应用时,会进行一次预编译(Ahead of Time, AOT),将字节码预先编译成机器码并存储在本地,这样应用每次运行时就不需要执行编

2021-02-04 18:30:27 206 4

原创 Android OpenGL ES2.0学习随笔

顶点着色器工作流程片元着色器工作流程OpenGL ES 2.0过程及理解:读取顶点数据 ——> 执行顶点着色器 ——> 组装图元 ——> 光栅化图元 ——> 执行片元着色器 ——> 写入帧缓冲区 ——> 显示到屏幕上OpenGL作为本地库直接运行在硬件上,没有虚拟机,也没有垃圾回收或者内存压缩顶点着色器是针对每个顶点都会执行,是确定每个顶点的位置;片元着色器是针对每个片元都会执行的程序,确定每个片元的颜色着色器需要进行编译,然后链接到OpenGL程序中。

2021-01-22 10:11:43 134

原创 java虚拟机理解随笔

java虚拟机有两个特点:语言无关java虚拟机只和class关联,只要编写的程序语言能够编译成class文件,就能够在java虚拟机上运行。平台无关java之所以跨平台是因为java虚拟机的适配,不同的系统实现不同的JVM。编写好的java源程序,通过java编译器javac编译成java虚拟机识别的class文件(字节码文件),然后由JVM中类加载器加载字节码文件,加载完毕之后再由JVM引擎去执行。在加载完毕到执行过程中,JVM会将程序执行时 用到的数据和相关信息存储在运行时数据区(Run

2021-01-20 10:42:46 120

原创 Android虚拟机理解随笔

Android中系统通过init进程创建出来的zygote进程,为每个应用创建一个进程和复制一个虚拟机实例,而每个应用都运行在一个DVM或AVM实例中,而每个进程或线程都对应Linux中的一个进程或线程。JVM:标准的虚拟机,java文件编译生成多个java字节码文件(.class),并打包成jar文件,jvm运行的字节码就是从.class和jar文件中获取的;jvm是基于栈的,必须使用指令来载入。DVM:基于寄存器,需要更大的指令,将java编译成.class文件,然后通过dex工具将多个.class

2021-01-18 16:07:01 125

原创 RecyclerView ItemTouchHelper实现拖拽、侧滑功能

ItemTouchHelperItemTouchHelper:是一个工具类,可实现滑动删除和拖拽移动,使用这个工具类需要配合RecyclerView和ItemTouchHelper.Callback使用。使用方法1.新建类继承自ItemTouchHelper.Callback实现这个类需要重写三个方法:class MyCallback extends ItemTouchHelper.Callback { //该方法用于返回可以滑动的方向,比如说允许从右到左侧滑,允许上下拖动等。

2021-01-11 21:51:01 461

原创 ViewPager + TabLayout + Fragment 页面刷新问题

ViewPager + TabLayout + Fragment 页面刷新问题在做多Fragment Tab界面嵌套多Fragment时,我们经常使用ViewPager + TabLayout + Fragment的方式实现,使用方法adapter = new MyFragmentStatePagerAdapter(getFragmentManager(), 0);viewPager.setAdapter(adapter);tabLayout.setupWithViewPager(view

2021-01-08 10:33:22 744

原创 观察者模式

观察者模式定义使用场景主要角色SubjectConcrete SubjectObserverConcrete Observer优点缺点定义定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新使用场景关联行为场景,需要注意的是关联行为是可拆分的,而不是“组合”关系事件多级触发场景跨系统的消息交换场景,如消息队列、事件总线处理机制主要...

2020-03-27 21:24:28 125

原创 Https建立过程

HTTPS建立连接过程HTTPS定义HTTPS本质HTTPS建立连接过程客户端建立TLS连接服务器发回证书客户端验证服务器证书客户端和服务器协商对称密钥使用对称密钥开始通信HTTPS定义在HTTP之下增加一个安全层,用于保障HTTP的加密传输HTTPS本质在客户端和服务器之间用非对称加密协商出一套对称加密密钥,每次发送信息之前将内容加密,收到之后解密,达到内容的加密传输HTTPS建立连接...

2020-03-27 21:07:59 274

原创 关于加密

关于加密对称加密非对称加密数字签名对称加密 加密算法 解密算法 密钥 密钥原数据 ————>密文————>原数据常用的算法有:DES、AES非对称加密 加密算法 加密算法 公钥 私钥原数据 ————>密文————>原数据数字签名 签名 验证 加密算法 加密算...

2020-03-16 15:00:55 155

原创 关于Http协议

关于Http协议格式Request MethodsStatus CodeHeaderHTTP: Hypertext Transfer Protocal格式示例:http://github.com/user/?gender=male其中:http:// 为协议类型github.com为服务器地址/user?gender=male为路径path真正发送的格式为GET /user?g...

2020-03-16 14:51:23 126

原创 面向对象的三个基本特征

面向对象的三个基本特征封装性继承性多态性封装性令外部访问者不能随意存取对象的内部数据继承性特殊类拥有一般类的全部数据和操作多态性在父类中成员变量和成员函数被子类继承后,可以具有不同的状态或表现行为...

2020-03-14 16:50:31 69

原创 命令模式

命令模式定义使用场景定义将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化;对请求排队或记录请求日志,以及支持可撤销的操作使用场景需要抽象出待机执行的动作,然后以参数的形式提供出来在不同的时刻指定、排列和执行请求需要支持取消操作支持修改日志功能需要支持事务操作...

2020-03-14 16:41:24 127

原创 责任链模式

责任链模式定义使用场景定义使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止.使用场景多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定在请求处理者不明确的情况下向多个对象中的一个提交一个请求需要动态指定一组对象处理请求...

2020-03-14 16:37:24 64

原创 状态模式

状态模式定义使用场景定义当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类使用场景一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为代码中包含大量与对象状态有关的条件语句...

2020-03-14 16:26:03 89

原创 策略模式

策略模式定义使用场景定义定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.让算法独立于使用它的客户而独立变化.使用场景针对同一类型问题的多种处理方式,仅仅是具体行为有差别时需要安全地封装多种同一类型的操作时出现同一抽象类有多个子类,而又需要使用if-else或者switch-case来选择具体子类时...

2020-03-14 15:59:10 66

原创 抽象工厂方法模式

抽象工厂方法模式定义四到模块定义为创建一组相关或者是相互依赖的对象提供一个接口,而不需要指定它们的具体类.四到模块虽然抽象工厂方法模式的类繁多,但主要还是分四类:AbstractFactory:抽象工厂角色ConcreteFactory:具体工厂角色AbstractProduct:抽象产品角色ConcreteProduct:具体产品角色...

2020-03-14 15:54:26 85

原创 工厂方法模式

工厂方法模式定义四大模块定义定义一个用于创建对象的接口,让子类决定实例化哪个类四大模块抽象工厂,其为工厂方法模式的核心具体工厂,其实现了具体的业务逻辑抽象产品,是工厂方法模式所创建的产品父类具体产品,为实现抽象产品的某个具体产品的对象...

2020-03-14 15:50:43 62

原创 原型模式

原型模式定义使用场景定义用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象使用场景类初始化需要消耗非常多的资源通过new产生一个对象需要非常繁琐的数据准备或访问权限一个对象需要提供给其他对象访问,而且各个调用者可能多需要修改其值时...

2020-03-14 15:44:48 77

原创 Builder(建造者)模式

Builder模式Builder模式定义Android源码实例Builder模式定义一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程。Android源码实例Dialog的显示Dialog中通过getSystemService()获取WindowManager,然后通过Window对象的setWindowManager()将Win...

2020-03-14 15:13:14 145

原创 面向对象的六大原则

面向对象的六大原则单一职责原则 Single Responsibility Principle开闭原则 Open Close Principle里氏替换原则 Liskov Substitution Principle依赖倒置原则 Dependence Inversion Principle接口隔离原则 Interface Segregation Principe迪米特原则 Law of Demet...

2020-03-14 10:46:22 98

原创 Android 8.0 启动Service适配(Not allowed to start service Intent)

问题现象:App出现异常: java.lang.IllegalStateException: Not allowed to start service Intent xxxx app is in background uid UidRecordApp直接崩溃。问题原因:App targetSdkVersion>= 26的情况下,用户允许App开机自启动,App被杀死或...

2019-03-20 11:56:00 13855

原创 LeetCode 3. 无重复字符的最长子串

无重复字符的最长子串给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复...

2018-12-28 14:56:46 83

Android MVC、MVP、MVVM、MVI架构示例

Android MVC、MVP、MVVM、MVI架构示例

2022-11-09

JetpackWeather.rar

使用Jetpack实现MVVM架构的天气App

2021-04-01

Jetpack实现MVVM架构的天气App

使用Jetpack实现MVVM架构的天气App

2021-04-01

Android使用HttpClient和HttpsUrlConnection两种方式访问https网站

使用httpclient和httpsurlconnection两种方法访问https网址,同时分为验证证书和不验证证书两种方法

2016-01-09

Android DES,AES,RSA实现

实现了在Android中对DES,AES和RSA三种加密算法的使用

2016-01-09

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除