设计模式(十五)状态模式
本文首发于微信公众号「后厂技术官」
相关文章设计模式系列
前言建议在阅读本文前先阅读设计模式(十一)策略模式这篇文章,虽说状态模式和策略模式的结构几乎是相同的,但是它们所解决的问题是不同的,读完这两篇文章你就会有了答案。
1.状态模式定义状态模式定义定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式UML图
在享元模式中有如下角色:
Context:环境角色,定义客户端需要的接口,并且负责具体状态的切换。
State:抽象状态角色,可以是抽象类或者接口,负责对象状态定义,并封装了环境角色。
ConcreteState:具体状态角色,实现抽象角色类,定义了本状态所要做的事情。
2.简单实现状态模式拿用mp3听歌来说,mp3有四种基本状态,分别是开机、关机、上一首歌和下一首歌。如果我们要写一个对mp3进行控制的类,你可能会这样写,如下所示。
public class Mp3Controller { private static final int POWER_ON = 1; private static final in ...
我的独立博客:http://liuwangshu.cn上线了
关于独立博客我的独立博客地址为:http://liuwangshu.cn虽然有了独立博客,但我还会继续在CSDN、简书中持续更新我的文章。独立博客收入了我精选的70多篇文章,在电脑和手机上都有着良好的阅读体验,欢迎大家关注。
创建独立博客心得希望我的经验能帮助那些想要创建独立博客的朋友。
选择博客平台折腾了一个多星期分别试用了多个博客平台:
z-blog: 搭建比较方便,访问的速度还可以,就是后台配置有些简陋,体验不太好,还需要自己买虚拟主机。
WordPress:访问速度真心很慢,网上的文章多是如何去进行访问速度优化,打开个网页加载半天,同样需要自己买虚拟主机。
Jekyll:在windows平台搭建较费劲,主题较少,可以免费部署在GitHub、Coding上。
Hexo:在windows平台搭建简单,开源主题众多,可以免费部署在GitHub、Coding上。
最终我选择了Hexo+GitHub、Coding。
选择Hexo主题Hexo主题我试用了Yilia、Yelee和NexT,下面来做简单的点评。
NexT:最受欢迎的主题,Github有7000多个Start,文档详尽 ...
Android深入四大组件(一)应用程序启动过程(后篇)
本文首发于微信公众号「后厂技术官」
1.ActivityManageService到ApplicationThread的调用流程AMS的startActivity方法中return了startActivityAsUser方法:
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
@Override public final int startActivityAsUser(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) { enforceNotIso ...
Android深入四大组件(一)应用程序启动过程(前篇)
本文首发于微信公众号「后厂技术官」
前言在此前的文章中,我讲过了Android系统启动流程和Android应用进程启动过程,这一篇顺理成章来学习Android 7.0的应用程序的启动过程。分析应用程序的启动过程其实就是分析根Activity的启动过程。
1.Launcher请求ActivityManageService在 Android系统启动流程(四)Launcher启动过程与系统启动流程这篇文章我讲过Launcher启动后会将已安装应用程序的快捷图标显示到界面上,当我们点击应用程序的快捷图标时就会调用Launcher的startActivitySafely方法,如下所示。packages/apps/Launcher3/src/com/android/launcher3/Launcher.java
public boolean startActivitySafely(View v, Intent intent, Object tag) { ... try { success = startActivity(v, intent ...
Android绘制优化(二)布局优化
本文首发于微信公众号「后厂技术官」
相关文章Android性能优化系列
前言我们知道一个界面的测量和绘制是通过递归来完成的,减少布局的层数就会减少测量和绘制的时间,从而性能就会得到提升。当然这只是布局优化的一方面,那么如何来进行布局的分析和优化呢?本篇文章会给你一个满意的答案。
1.布局优化工具在讲到如何去布局优化前,我们先来学习两种布局优化的工具。
1.1 Hierarchy ViewerHierarchy Viewer是Android SDK自带的可视化的调试工具,用来检查布局嵌套和绘制的时间。需要注意的是在在Android的官方文档中提到:出于安全考虑,Hierarchy Viewer只能连接Android开发版手机或是模拟器。首先我们在Android Studio中选择Tools->Android->Android Device Monitor,在Android Device Monitor中选择Hierarchy Viewer ,如下图所示:
选择Hierarchy Viewer后会进出Hierarchy Viewer窗口,如下图所示。
Hierarchy ...
Android应用程序进程启动过程(后篇)
本文首发于微信公众号「后厂技术官」
前言在前篇中我们讲到了Android应用程序进程启动过程,这一篇我们来讲遗留的知识点:在应用程序进程创建过程中会启动Binder线程池以及在应用程序进程启动后会创建消息循环。
1.Binder线程池启动过程我们首先来看RuntimeInit类的zygoteInit函数,如下所示frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
public static final void zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader) throws ZygoteInit.MethodAndArgsCaller { if (DEBUG) Slog.d(TAG, "RuntimeInit: Starting application from zygote"); Trace.traceBegin(Trace.TRACE ...
Android应用程序进程启动过程(前篇)
本文首发于微信公众号「后厂技术官」
前言在此前我讲过Android系统的启动流程,系统启动后,我们就比较关心应用程序是如何启动的,这一篇我们来一起学习Android7.0 应用程序进程启动过程,需要注意的是“应用程序进程启动过程”,而不是应用程序启动过程。关于应用程序启动过程,我会在后续系列的文章中讲到。希望阅读这篇文章前先阅读本文列出的相关文章,要不你一脸蒙蔽,就别怪我了。
1.应用程序进程概述要想启动一个应用程序,首先要保证这个应用程序所需要的应用程序进程已经被启动。ActivityManagerService在启动应用程序时会检查这个应用程序需要的应用程序进程是否存在,不存在就会请求Zygote进程将需要的应用程序进程启动。在Android系统启动流程(二)解析Zygote进程启动过程这篇文章中,我提到了Zygote的Java框架层中,会创建一个Server端的Socket,这个Socket用来等待ActivityManagerService来请求Zygote来创建新的应用程序进程的。我们知道Zygote进程通过fock自身创建的应用程序进程,这样应用程序程序进程就会获得Z ...
Android绘制优化(一)绘制性能分析
本文首发于微信公众号「后厂技术官」
相关文章Android性能优化系列
前言一个优秀的应用不仅仅是要有吸引人的功能和交互,同时在性能上也有很高的要求。运行Android系统的手机,虽然配置在不断的提升,但仍旧无法和PC相比,无法做到PC那样拥有超大的内存以及高性能的CPU,因此在开发Android应用程序时也不可能无限制的使用CPU和内存,如果对CPU和内存使用不当也会造成应用的卡顿和内存溢出等问题。因此,应用的性能优化对于开发人员有着更高的要求。Android性能优化分为很多种,比较常用的有绘制优化、内存优化、耗电优化和稳定性优化等,这个系列我们就来学习性能优化中的绘制优化。
1.绘制原理Android绘制View有三个主要的步骤,分别是measure、layout和draw。关于它们的原理请查看我的文章Android View体系(七)从源码解析View的measure流程和Android View体系(八)从源码解析View的layout和draw流程,这里就不在赘述。measure、layout和draw方法主要是运行在系统的应用框架层,而真正将数据渲染到屏幕上的则是系统 ...
设计模式(十四)中介者模式
本文首发于微信公众号「后厂技术官」
相关文章设计模式系列
前言写了很多篇设计模式的文章,才发现没有讲关于设计模式的分类,那么这一篇就补上这一内容,顺便带来中介者模式的讲解。并与此前讲过的代理模式和外观模式做对比。
1.设计模式的分类GoF提出的设计模式总共有23种,根据目的准则分类分为三大类:
创建型模式,共五种:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
另外随着设计模式的发展也涌现出很多新的设计模式:它们分别是规格模式、对象池模式、雇工模式、黑板模式和空对象模式等。
2.中介者模式从前面讲到的设计模式的分类中,我们应该得知中介者模式是行为型模式的一种,旨在处理类或对象如何交互及如何分配职责。中介者模式又叫做调停者模式,名字跟出国留学中介和房产中介是类似的。拿房产中介来说,现在房子买家和房子卖家非常多,如果任由房子 ...
算法(三)初等排序后篇[选择和冒泡排序]
本文首发于微信公众号「后厂技术官」
1.选择排序根据上一篇文章讲到的插入排序和希尔排序,我们把选择排序的数组也分为已排序部分和未排序部分。
图解选择排序 在用图来讲解选择排序之前,我们要先了解选择排序的规则。 选择排序的规则 就是重复执行以下的处理:1.找出未排序部分最小值的位置min。2.将min位置的元素与未排序部分的起始元素做对比,如果顺序错误则将它们进行就交换。
以数组a={5,4,8,7,9,3,1}为例,我们对其进行从小到大排序,排序过程如下图所示。
首先我们找到未排序部分最小的值a[6]=1和未排序的起始元素a[0]=5相比较,发现a[6]的值更小,则将两个数进行交换,以此类推。
最终得到的结果为a={1,3,4,5,7,8,9}
实现选择排序接下来要实现插入排序,针对下图来定义变量。
如上图所示,i为循环变量,代表未排序部分的开头元素; j为循环变量,用来遍历未排序部分找出最小值min。接下来我们用代码来实现选择排序,如下所示。
public class SelectionSort { public static void main(String[] ...
Android系统启动流程(四)Launcher启动过程与系统启动流程
本文首发于微信公众号「后厂技术官」
前言此前的文章我们学习了init进程、Zygote进程和SyetemServer进程的启动过程,这一篇文章我们就来学习Android系统启动流程的最后一步:Launcher的启动流程,并结合本系列的前三篇文章的内容来讲解Android系统启动流程。建议读这篇文章前要通读本系列的前三篇文章,否则你可能不会理解我在讲什么。
1.Launcher概述Android系统启动的最后一步是启动一个Home应用程序,这个应用程序用来显示系统中已经安装的应用程序,这个Home应用程序就叫做Launcher。应用程序Launcher在启动过程中会请求PackageManagerService返回系统中已经安装的应用程序的信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上,这样用户可以通过点击这些快捷图标来启动相应的应用程序。
2.Launcher启动流程SyetemServer进程在启动的过程中会启动PackageManagerService,PackageManagerService启动后会将系统中的应用程序安装完成。在此前已经启动的ActivityMa ...
算法(二)初等排序前篇[插入和希尔排序]
本文首发于微信公众号「后厂技术官」
前言排序是算法的基础,排序有很多种方法,有些方法实现起来很简单,但是效率较差,我们可以将这些排序的方法称之为初等排序。这篇文章我们就来学习初等排序中的插入排序和希尔排序。
1.插入排序插入排序比较容易想到,思路与打扑克时排列牌的顺序是类似的。比如我们左手拿牌,然后用右手将牌从左到右,从小到大来排序,这就需要我们把需要进行排列的牌抽出来放到合适的位置,并且不断的重复,直到牌的顺序排好,这个过程就可以理解为插入排序。
图解插入排序插入排序过程中会将需要排序的数组,分为两个部分:已排序部分和未排序部分,如下图所示。
从图中可以看出这个数组分为两个部分,其中下标为0、1、2的元素为已排列部分,其余的则为未排列部分。
插入的排序规则:将开头元素视为以排序部分。接着执行如下的处理,直到没有未排序部分。
取出未排序部分的开头元素赋值给临时保存数据的变量v。
在已排列的部分将所有比v大的元素向后移动一个位置。
将取出的元素v插入空位。
按照这个规则,我们来举一个简单的例子。我们对数组 a={8,3,1,5,2,1} 进行从小到大排序,数组a如下图所示。
...
Android系统启动流程(三)解析SyetemServer进程启动过程
本文首发于微信公众号「后厂技术官」
前言上一篇我们学习了Zygote进程,并且知道Zygote进程启动了SyetemServer进程,那么这一篇我们就来学习Android7.0版本的SyetemServer进程的启动过程。
1.Zygote启动SyetemServer进程在上一篇文章中我们讲到在ZygoteInit.java的startSystemServer函数中启动了SyetemServer进程,如下所示。frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
private static boolean startSystemServer(String abiList, String socketName) throws MethodAndArgsCaller, RuntimeException { ... if (pid == 0) { if (hasSecondZygote(abiList)) { ...
Android系统启动流程(二)解析Zygote进程启动过程
本文首发于微信公众号「后厂技术官」
前言上一篇文章我们分析了init进程的启动过程,启动过程中主要做了三件事,其中一件就是创建了Zygote进程,那么Zygote进程是什么,它做了哪些事呢?这篇文章会给你这些问题的答案。
1.Zygote简介在Android系统中,DVM(Dalvik虚拟机)、应用程序进程以及运行系统的关键服务的SystemServer进程都是由Zygote进程来创建的,我们也将它称为孵化器。它通过fork(复制进程)的形式来创建应用程序进程和SystemServer进程,由于Zygote进程在启动时会创建DVM,因此通过fork而创建的应用程序进程和SystemServer进程可以在内部获取一个DVM的实例拷贝。关于init启动zygote我们在上一篇文章已经提到了,这里就不赘述了,这篇文章主要分析Android7.0 Zygote的启动流程。
2.AppRuntime分析我们从上篇文章得知init启动zygote时主要是调用app_main.cpp的main函数中的AppRuntime的start来启动zygote进程的,我们就从app_main.cpp的 ...
算法(一)时间复杂度
本文首发于微信公众号「后厂技术官」
前言算法很重要,但是一般情况下做移动开发并不经常用到,所以很多同学早就将算法打了个大礼包送还给了老师了,况且很多同学并没有学习过算法。这个系列就让对算法头疼的同学能快速的掌握基本的算法。过年放假阶段玩了会游戏NBA2K17的生涯模式,没有比赛的日子也都是训练,而且这些训练都是自发的,没有人逼你,从早上练到晚上,属性也不涨,但是如果日积月累,不训练和训练的人的属性值就会产生较大差距。这个突然让我意识到了现实世界,要想成为一个球星(技术大牛)那就需要日积月累的刻意训练,索性放下游戏,接着写文章吧。
1.算法的效率虽然计算机能快速的完成运算处理,但实际上,它也需要根据输入数据的大小和算法效率来消耗一定的处理器资源。要想编写出能高效运行的程序,我们就需要考虑到算法的效率。算法的效率主要由以下两个复杂度来评估:时间复杂度:评估执行程序所需的时间。可以估算出程序对处理器的使用程度。空间复杂度:评估执行程序所需的存储空间。可以估算出程序对计算机内存的使用程度。
设计算法时,一般是要先考虑系统环境,然后权衡时间复杂度和空间复杂度,选取一个平衡点。不过,时间复 ...
Android系统启动流程(一)解析init进程启动过程
本文首发于微信公众号「后厂技术官」
前言作为“Android框架层”这个大系列中的第一个系列,我们首先要了解的是Android系统启动流程,在这个流程中会涉及到很多重要的知识点,这个系列我们就来一一讲解它们,这一篇我们就来学习init进程。
1.init简介init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等。init进程是由多个源文件共同组成的,这些文件位于源码目录system/core/init。本文将基于Android7.0源码来分析Init进程。
2.引入init进程说到init进程,首先要提到Android系统启动流程的前几步:1.启动电源以及系统启动当电源按下时引导芯片代码开始从预定义的地方(固化在ROM)开始执行。加载引导程序Bootloader到RAM,然后执行。2.引导程序Bootloader引导程序是在Android操作系统开始运行前的一个小程序,它的主要作用是把系统OS拉起来并运行。3.linux内核启动内核启动时,设置缓存、被保护存储器、计划列表,加载驱动。当内 ...