Android系统启动流程(四)Launcher启动过程与系统启动流程

本文首发于微信公众号「后厂技术官」

前言

此前的文章我们学习了init进程、Zygote进程和SyetemServer进程的启动过程,这一篇文章我们就来学习Android系统启动流程的最后一步:Launcher的启动流程,并结合本系列的前三篇文章的内容来讲解Android系统启动流程。建议读这篇文章前要通读本系列的前三篇文章,否则你可能不会理解我在讲什么。

查看更多

分享到 评论

算法(二)初等排序前篇[插入和希尔排序]

本文首发于微信公众号「后厂技术官」

前言

排序是算法的基础,排序有很多种方法,有些方法实现起来很简单,但是效率较差,我们可以将这些排序的方法称之为初等排序。这篇文章我们就来学习初等排序中的插入排序和希尔排序。

查看更多

分享到 评论

Android系统启动流程(三)解析SyetemServer进程启动过程

本文首发于微信公众号「后厂技术官」

前言

上一篇我们学习了Zygote进程,并且知道Zygote进程启动了SyetemServer进程,那么这一篇我们就来学习Android7.0版本的SyetemServer进程的启动过程。

查看更多

分享到 评论

Android系统启动流程(二)解析Zygote进程启动过程

本文首发于微信公众号「后厂技术官」

前言

上一篇文章我们分析了init进程的启动过程,启动过程中主要做了三件事,其中一件就是创建了Zygote进程,那么Zygote进程是什么,它做了哪些事呢?这篇文章会给你这些问题的答案。

查看更多

分享到 评论

算法(一)时间复杂度

本文首发于微信公众号「后厂技术官」

前言

算法很重要,但是一般情况下做移动开发并不经常用到,所以很多同学早就将算法打了个大礼包送还给了老师了,况且很多同学并没有学习过算法。这个系列就让对算法头疼的同学能快速的掌握基本的算法。过年放假阶段玩了会游戏NBA2K17的生涯模式,没有比赛的日子也都是训练,而且这些训练都是自发的,没有人逼你,从早上练到晚上,属性也不涨,但是如果日积月累,不训练和训练的人的属性值就会产生较大差距。这个突然让我意识到了现实世界,要想成为一个球星(技术大牛)那就需要日积月累的刻意训练,索性放下游戏,接着写文章吧。

查看更多

分享到 评论

Android系统启动流程(一)解析init进程启动过程

本文首发于微信公众号「后厂技术官」

前言

作为“Android框架层”这个大系列中的第一个系列,我们首先要了解的是Android系统启动流程,在这个流程中会涉及到很多重要的知识点,这个系列我们就来一一讲解它们,这一篇我们就来学习init进程。

查看更多

分享到 评论

设计模式(十三)抽象工厂模式

本文首发于微信公众号「后厂技术官」

相关文章
设计模式系列

前言

此前讲解过简单工厂模式和工厂模式,这一篇我们来学习工厂系列的最后一个模式抽象工厂模式,建议在阅读此文前,请先阅读设计模式(四)简单工厂模式设计模式(十)工厂方法模式这两篇文章。

查看更多

分享到 评论

设计模式(十二)享元模式

本文首发于微信公众号「后厂技术官」

相关文章
设计模式系列

享元模式定义

享元模式是结构型设计模式的一种,是池技术的重要实现方式,它可以减少应用程序创建的对象,降低程序内存的占用,提高程序的性能。

定义:使用共享对象有效的支持大量细粒度的对象

要求细粒度对象,那么不可避免地使得对象数量多且性质相近,这些对象分为两个部分:内部状态和外部状态。内部状态是对象可共享出来的信息,存储在享元对象内部并且不会随环境的改变而改变。而外部状态是对象依赖的一个标记是随环境改变而改变的并且不可共享的状态。
享元模式结构图如下图所示。

在享元模式中有如下角色:

  • Flyweight:抽象享元角色,同时定义出对象的外部状态和内部状态的接口或者实现。
  • ConcreteFlyweight:具体享元角色,实现抽象享元角色定义的业务。
  • FlyweightFactory:享元工厂,负责管理对象池和创建享元对象。

享元模式简单实现

某宝商城卖商品,如果每个用户下单都生成商品对象显然会耗费很多资源,如果赶上双11,那恐怖的订单量会生成很多商品对象,更何况商城卖的商品种类繁多,这样就极易会产生OOM。因此我们采用享元模式来对商品的创建进行优化。

抽象享元角色

抽象享元角色是一个商品接口,它定义了showGoodsPrice方法用来展示商品的价格:

public interface IGoods {
    public void showGoodsPrice(String name);
}

具体享元角色

定义类Goods,它实现IGoods 接口,并实现了showGoodsPrice方法,如下所示。

public class Goods implements IGoods{
    private String name;//名称
    private String version;//版本
    Goods(String name){
        this.name=name;
    }
    @Override
    public void showGoodsPrice(String version) {
        if(version.equals("32G")){
            System.out.println("价格为5199元");
        }else if(version.equals("128G")){
            System.out.println("价格为5999元");
        }
    }
}

其中name为内部状态,version为外部状态。showGoodsPrice方法根据version的不同会打印出不同的价格。

享元工厂

public class GoodsFactory {
    private static Map<String,Goods> pool=new HashMap<String, Goods>();
    public static Goods getGoods(String name){
        if(pool.containsKey(name)){
            System.out.println("使用缓存,key为:"+name);
            return pool.get(name);
        }else{
            Goods goods=new Goods(name);
            pool.put(name,goods);
            System.out.println("创建商品,key为:"+name);
            return goods;
        }
    }
}

享元工厂GoodsFactory 用来创建Goods对象。通过Map容器来存储Goods对象,将内部状态name作为Map的key,以便标识Goods对象。如果Map容器中包含此key,则使用Map容器中存储的Goods对象,否则就新创建Goods对象,并放入Map容器中。

客户端调用

客户端中调用GoodsFactory的getGoods方法来创建Goods对象,并调用Goods 的showGoodsPrice方法来显示产品的价格,如下所示。


public class Client {
    public static void main(String[]args) {
        Goods goods1=GoodsFactory.getGoods("iphone7");
        goods1.showGoodsPrice("32G");
        Goods goods2=GoodsFactory.getGoods("iphone7");
        goods2.showGoodsPrice("32G");
        Goods goods3=GoodsFactory.getGoods("iphone7");
        goods3.showGoodsPrice("128G");
    }
}

运行结果为:
创建商品,key为:iphone7
价格为5199元
使用缓存,key为:iphone7
价格为5199元
使用缓存,key为:iphone7
价格为5999元

从输出看出,只有第一次是创建Goods对象,后面因为key值相同,所以都是使用了对象池中的Goods对象。在这个例子中,name作为内部状态是不变的,并且作为Map的key值是可以共享的。而showGoodsPrice方法中需要传入的version值则是外部状态,他的值是变化的。

享元模式的使用场景

  • 系统中存在大量的相似对象。
  • 需要缓冲池的场景。
  • 细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份。

参考资料
《大话设计模式》
《设计模式之禅》
《Android源码设计模式》

分享到 评论

Android系统架构与系统源码目录

前言

技术博客终于可以恢复正常的更新速度了,原因是我编写的进阶书籍的初稿已经完成,窃以为它将会是Android应用书籍中最有深度的一本,可以说是《Android开发艺术探索》的姊妹篇。在这本书的最后一章我会分析Android底层源码,但是毕竟是一本Android应用开发的书,对于底层源码阅读也只能带大家入个门。因此,在博客中我会新开一个“系统源码解析”的系列,该系列的开篇就是本篇文章。

查看更多

分享到 评论

Android事件总线(四)源码解析otto

本文首发于微信公众号「后厂技术官」

前言

上一篇文章中讲到了otto的用法,这一篇我们来讲一下otto的源码。可能有人觉得otto过时了,但是通过源码我们学习的是高手设计otto时的设计理念,这种设计理念是不过时的。

查看更多

分享到 评论

Android事件总线(三)otto用法全解析

本文首发于微信公众号「后厂技术官」

前言

otto 是 Square公司发布的一个发布-订阅模式框架,它基于Google Guava 项目中的event bus模块开发,针对Android平台做了优化和加强。虽然Square已经停止了对otto的更新并推荐使用RxJava和RxAndroid来替代它,但是otto的设计理念和源码仍旧值得学习,这一篇先来学习下otto的使用方法。

查看更多

分享到 评论

Android网络编程(十一)源码解析Retrofit

本文首发于微信公众号「后厂技术官」

相关文章
Android网络编程系列

前言

最近博客的产出确实很少,因为博主我正在写一本Android进阶书籍,两头很难兼顾,但是每个月也得至少发一篇博客。上一篇我们介绍了Retrofit的使用方法,这一篇我们照例来学习Retrofit的源码。

查看更多

分享到 评论

这只是个开始,写在CSDN博客访问量破百万

对于很多技术博客大神,百万的访问量不值一提,但是对我来说,这是一个里程碑,也是一个新的开始,因此写此文来纪念下,希望几年后的我阅读此文仍旧能不忘此时的初心。

查看更多

分享到 评论

Android网络编程(十)Retrofit2后篇[注解]

本文首发于微信公众号「后厂技术官」

相关文章
Android网络编程系列

前言

在上一篇Android网络编程(九)Retrofit2前篇[基本使用]中我们了解了Retrofit的最基本的GET方式访问网络的写法以及请求参数的简单介绍。这一篇我们来详细的了解Retrofit的注解。

查看更多

分享到 评论

AsyncTask源码分析

本文首发于微信公众号「后厂技术官」

查看更多

分享到 评论

设计模式(十一)策略模式

本文首发于微信公众号「后厂技术官」

相关文章
设计模式系列

前言

当我们写代码时总会遇到一种情况就是我们会有很多的选择,由此衍生出很多的if…else,或者case。如果每个条件语句中包含了一个简单的逻辑,那还比较容易处理,如果在一个条件语句中又包含了多个条件语句就会使得代码变得臃肿,维护的成本也会加大,这显然违背了开放封闭原则。这一讲我们就来讲策略模式,来看看它是怎么解决如上所说的问题的。

查看更多

分享到 评论