自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

周将的博客

今天,你努力了吗?

  • 博客(82)
  • 收藏
  • 关注

原创 JSON三种数据解析方法

引言 JSON数据现在是我们开发中用的最多的,百分之八十的数据都是通过JSON方式进行传输,那么想要学好JSON解析就要了解什么是JSON数据,怎么快速解析它从而提升开发效率。

2020-05-17 21:49:17 347617 11

原创 Git的详细使用教程——三部曲

Git的详细使用教程——Git三部曲 作为一名开发人员,在我们平时的开发中会经常遇到版本管理工具,今天我们就来说说Git的使用,最近我膜拜了蒋鑫的《Git权威指南》一书,收益良多,在此和大家交流交流。Git是一种分布式版本管理工具,每个人参与开发人员的电脑都是一台代码的仓库,使用起来特别灵活,这里我们就不对Git的安装和配置做说明了,网上相关内容很多。Git的优点也就不多说了,直接开...

2018-05-05 19:27:03 9632 2

原创 安卓扫描银行卡获取卡号信息

安卓图像扫描识别银行卡

2017-08-27 13:32:25 6461 2

原创 Kotlin语法小结

Kotlin的好处1 语法简洁,代码数量减半2 语法更加高级,增加了很多现代高级语言的特性,提升了效率3 语言安全性方面做了很大的改变,几乎杜绝了空指针异常4 和Java 100%兼容Kotlin有出色的类型推导机制Kotlin阉割掉了基本数据类型,全部采用引用数据类型val和var 永远优先使用valKotlin语法糖:当函数只有一行代码时候,kotlin允许我们不必要编写函数体,而是直接将唯一的一行代码写在函数的尾部,中间用等号连接,省略掉return,由于出色的类型推导机制,返回

2021-02-21 22:33:11 507

原创 Android应用程序进程启动源码解析

在前面我们从源码层面分析了Android系统启动流程,了解它们也主要是为了我们开发App服务的。应用程序想要启动首先需要应用程序进程存在,而应用程序进程的创建需要SystemServer进程中的ActivityManagerService向Zygote进程发送消息,通过zygote进程fork自身来创建应用程序进程,新创建的应用程序进程就有zygote进程创建的虚拟机实例,同时创建了Binder线程池和Handler消息循环机制,便于进程间消息通信。今天就来从源码角度分析我们关心的Android应用程序进.

2020-10-07 15:51:25 671 1

原创 ViewGroup事件分发机制源码解析(二)ViewGroup篇(含滑动冲突源码解析和解决)

上一篇讲解了View的事件分发机制,查看点击链接View事件分发机制查看。本文基于Android9.0的源码进行分析ViewGroup的事件分发机制和事件冲突解决方案,源码点击https://github.com/Oaman/Forward查看。概述本文分如下几个步骤分析ViewGroup的Down事件的分发源码分析ViewGroup的Move事件的分发源码分析ViewGroup的滑动事件冲突处理实战 + 源码分析ViewGroup的事件分发机制源码概览ViewGroup的dispat.

2020-10-07 15:49:06 504

原创 ViewGroup事件分发机制源码解析(一)View篇

本篇基于Android9.0的源码进行分析View的事件分发机制。View事件处理机制源码分析布局文件如下,根View是一个LinearLayout,内部放了两个view分别是Button和ImageView.<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://s.

2020-10-07 15:47:11 379 4

原创 Android系统启动流程(四)Launcher进程启动过程解析(附带面试题)

前面我们分析了init进程,zygote进程,SystemServer进程,本篇的Launcher是系统启动流程的最后一个进程。1 Launcher概述Launcher进程是一个系统的应用程序,位于packages/apps/Launcher3中,它用于显示已经安装的应用程序,它通过访问PackageManagerService获取安装的应用程序,然后将他们封装成一个个的快捷图标显示到屏幕上,每一个图标包含了被启动应用程序的Intent信息,点击之后就可以启动对应应用程序。2 Launcher进.

2020-10-07 15:36:46 3657 2

原创 Android系统启动流程(三)SystemServer进程启动过程解析

上一篇我们分析了zygote进程的启动过程,其中有一个步骤是startSystemServer,今天这一篇就来详细分析一下system_server进程的启动过程。1 Zygote中startSystemServerframeworks/base/core/java/com/android/internal/os/ZygoteInitprivate static boolean startSystemServer(String abiList, String socketName) .

2020-10-07 15:33:31 891

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

上一篇中解析了init进程的启动流程,其中最后创建了zygote进程,本篇我们来详细分析zygote进程的部分。1 zygote进程概述Zygote进程又名孵化器进程,正如其名,它主要用于孵化子进程。在Android系统中有以下两种程序:java应用程序,主要基于ART虚拟机,所有的应用程序apk都属于这类native程序,也就是利用C或C++语言开发的程序,如bootanimation。所有的Java应用程序进程及系统服务SystemServer进程都由Zygote进程通过Linux的fork().

2020-10-07 15:28:39 616

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

init进程是Android系统第一个用户态的进程,init被赋予了很多重要的职责,比如我们熟悉的Zygote孵化器进程就是由init进程启动的。今天我们就来学习init进程的启动过程。1 init进程启动之前分析在分析init进程之前,我们先简单说一下init之前的步骤,大概流程如下:1) 按Power键启动电源及系统启动当按下电源键,引导芯片代码开始从固化在ROM中预定义的地方开始执行,加载引导程序Bootloader到RAM,然后执行引导程序。2) 引导程序Bootloader引导程序.

2020-10-07 15:10:22 2875 2

原创 Android系统架构解析与系统源码目录

Android框架是一个大的系列,熟悉其中的流程对于Android开发尤其重要,这里面有很多重要的工作和面试的知识点,从今天开始,我将发布一个系列博客,对于系统源码层进行分析。今天首先对Android的框架结构以及系统源码目录进行解析。1 Android系统架构图众所周知,Android是谷歌开发的一款基于Linux的开源操作系统,Android系统架构分为五层,从下到上依次是Linux内核层,硬件抽象层,系统运行库层(Android Runtime + Native C/C++ Librarie.

2020-10-07 15:07:10 784 1

原创 Retrofit如何实现自定义注解?

Retrofit现在在网络请求中是使用的最多的库,它是对OkHttp的一层封装,使用起来非常方便。但是在工作中经常会遇到一些需求,比如对某些接口加上一些token验证,某一些不需要加上token验证,我们当然可以在每一个接口后面直接加上获取不加这个参数,但是这样做不是好的解决方案。那么这个时候我们就需要考虑使用自定义注解的方式来解决这个问题。首先实现一个简单的网络请求我们使用wanandroid中的两个接口用来做演示,wanandroid地址是https://www.wanandroid.com/.

2020-09-13 10:33:09 1410 2

原创 分享几个面试题

分享三道简单的算法面试题1 如何检验一个数是不是2的次幂我们知道Hashmap的数组长度必须是2的次幂, 目的是为了更好的散列均匀,那么怎么判断一个数是不是2的次幂呢?这里我们从二进制分析下,如果一个数是2 的次幂的话,有什么特征,比如8的话,二进制是1000,4的话是100,2的话是10,首位都是1,那么有这么个规律的话,如何使用这个规律呢? public static void main(String[] args) { System.out.println(validat.

2020-09-13 09:04:37 275 1

原创 Kotlin中的out和in

说到Kotlin中的out和in关键字,可能有些人都是what表情?最开始的我也见到这两个关键字的时候也是一脸懵逼,其实如果熟悉了Java的泛型之后,这两个关键字就秒懂了,其实无非还是PECS那一套,无非在kotlin中换了个名字而已,out对应Java的? extend,in对应kotlin的? super。本篇文章我结合kotlin看看这个两个关键字的具体用法(本文是看郭霖大神的第一行代码第三版而作,推荐大家看看这本书,就当是查缺补漏,而且还能学习很多kotlin的知识)。out的使用首先我们声.

2020-09-13 00:31:26 5367 2

原创 枚举单例,了解一下?

单例模式在我们书写代码中是最经常使用的一种设计模式,但是这种设计模式真的安全吗?如果不安全的话,我们有没有安全的单例模式?其实这也是大厂面试的时候可能会问道的面试题,本篇我们来研究下这个问题。引出问题1 双重锁定单例和静态内部类单例安全吗?2 枚举单例使用过吗?它为什么是安全的?3 Kotlin中的单例有使用过吗?双重锁定单例首先我们快速回忆一下双重锁定单例和静态内部类单例,首先双重锁定单例如下:public class Manager { private volatile st.

2020-09-12 23:21:57 407

原创 面试题:你知道泛型擦除后是如何获取泛型信息的吗?

前面分享了一篇关于泛型的基础文章,Java泛型深度解析以及面试题,关于泛型的基础感兴趣的可以先看看那篇文章再来看这一篇文章,今天我们结合两个面试题深入分析下泛型。Java泛型擦除后能够添加不同泛型类型的元素?泛型擦除后是如何获取泛型信息?1 泛型擦除后能否添加非泛型类型的元素?下面看一段代码:public static void main(String[] args) throws Exception { Class c1 = new ArrayList<String>().

2020-09-12 16:03:37 1768

原创 一道关于Integer的面试题,你真的会了吗?

今天分享一道关于Integer的面试题。1 面试题面试题是这样的, 要手写打印结果:public static void main(String[] args) { Integer a = 1; Integer b = 2; Integer c = 3; Integer d = 3; Integer e = 128; Integer f = 128; Long g = 3L; .

2020-09-12 13:42:50 505

原创 实战--Gradle插件化一键实现自动360加固

平时的打包测试中,我们会使用到360加固保来手动对apk进行签名和加固,比较繁琐。今天本篇实战讲解如何使用gradle插件化实现360自动加固,一键彻底解放双手。插件的编写1 首先到官网https://jiagu.360.cn下载加固包,这里面的jiagu.jar文件后面会用到,还有里面有一些说明性的文本内容可以阅读一下,帮助使用。2 编写插件有三种方式,我们选择创建一个java-library的module,来编写我们的插件,在main目录下创建一个如图所示的文件,文件夹的路径和名称除.

2020-05-22 01:26:19 1004

原创 面试题:Java注解的理解和应用场景

所有的注解的父类都是Annotation根据注解的保留级别不同,对注解的使用自然存在不同场景。由注解的三个不同保留级别可知,注解作用于:源码、字节码与运行时你能举一些案例吗?javac在编译java文件之前会先调取注解处理程序对注解的处理,然后才会编译java文件注解的使用场景SOURCE:IDEA语法检查APT注解器处理 Annotation Process ToolCLASS:字节码插桩技术RUNTIME:注解保留至运行期,意味着我们能够在运行期间结合反射技术获取注解中的

2020-05-17 21:35:39 2125

原创 Java泛型深度解析以及面试题

泛型是在JDK5引入的新特性,提供了编译时类型检测安全机制。该机制允许程序员在编译时检测到非法的类型,泛型本质是参数类型。1 增强编译时错误检测,减少类型安全问题引发的运行时异常 2 增加代码的复用性泛型类泛型接口 如果父类是泛型,子类也需要声明泛型;如果父类具体化,子类就不需要声明了泛型方法 public void test(T t){}类型参数和类型变量Foo Foo钻石运算符DiamondJDK7以下版本就可以Box box = new Box();JDK7及以上版本

2020-05-16 23:27:45 5572 2

原创 synchronized背后的“monitor锁”和Lock的比较

前言在前面文章 synchronized关键字的四种加锁方式中介绍了四种synchronized的使用和区别,但是效果都是一样的,今天我们更加深入的看一看synchronized背后的’'monitor"锁,以及和Lock的区别。synchronized背后的’'monitor"锁synchronized的使用非常简单,仅需要在方法或者代码块中使用synchronized就可以了,使用看...

2020-03-29 19:04:31 1425

原创 wait/notify/notifyAll常见面试题解析

面试常见问题:为什么 wait 必须在 synchronized 保护的同步代码中使用?为什么 wait/notify/notifyAll 被定义在 Object 类中,而 sleep 定义在 Thread 类中?wait/notify 和 sleep 方法的异同?...

2020-03-29 11:42:02 915

原创 volatile关键字详解

Volatile关键字详解

2020-03-25 23:11:36 332

原创 synchronized关键字的四种加锁方式

本篇我们来讲解synchronized关键字的四种加锁使用方式,并对其进行比较。synchronized对方法加锁public class SynchronizedTest { static class Thread1 extends Thread { Utils mUtils; Thread1(Utils utils) { ...

2020-03-24 23:23:35 2941

原创 生产者消费者模式详解

实现生产消费者模式的几种方式

2020-03-24 00:07:02 759

原创 Java线程生命周期

Java线程状态详解

2020-03-24 00:05:55 1220

原创 只有一种实现多线程的方式 ?

本篇讲解Java线程部分。

2020-03-22 23:58:56 231

原创 Java集合框架图解

本文讲述一下Java的集合框架

2020-03-21 23:33:34 5841 4

原创 Android跨进程(IPC)通信方式详解

前言Android跨进程通信在工作中是经常使用到的,本篇来讲述Android中几种进程间通信的方式。Android进程间通信简介进程间通信简称IPC,英文为 Inter Process Communication ,在操作系统中,线程是CPU调度的基本单元,进程是操作系统调度的基本单元。在Android中一个进程一般指一个应用程序,可以包含多个线程,但最少有一个线程,在Android是主...

2020-03-15 22:20:41 4336

原创 HashMap实现原理与源码分析(JDK1.7与JDK1.8对比分析)

首先分析1.7源码

2020-03-12 00:16:49 634

原创 JVM结构和GC机制详解

JVM是Java学习路上不可或缺的重要组成部分,想要成为一个高级开发者,就必须了解JVM(Java Virtual Machine),而且它也是面试必问的问题,这一篇我们就来聊聊JVM,主要包括JVM结构,内存区域,垃圾检测算法,垃圾回收算法。JVM结构JVM包含四个部分,如图所示类加载器(ClassLoader):负责将class类加载到JVM中,关于类加载机制,后面会有单独文章介...

2020-03-10 23:37:43 681

原创 原码,反码,补码和进制的那些事

源码,反码,补码是计算机中比较原理和底层的知识,理解他们有助于未来更好的编程工作,我们今天就来聊聊那些不太费脑但是非常重要的知识–原码,反码,补码。原码,反码,补码的讲解首先我们先了解原码是什么?原码是是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。反码通...

2020-03-07 14:08:12 795

原创 Android Jetpack架构组件(九)WorkManager源码篇

上一篇讲解了WorkManager使用篇,本篇我们就从源码角度来分析WorkManager的工作原理。WorkManager的原理

2020-03-03 20:07:32 1822 2

原创 Android Jetpack架构组件(八)WorkManager使用篇

前言WorkManager是Jetpack很重要的一个组件,本篇我们就先来讲讲它是如何使用的,在讲解之前我们先了解关于后台处理的一些痛点。后台处理指南我们知道每个 Android 应用都有一个主线程,它负责处理界面(包括测量和绘制视图)、协调用户互动以及接收生命周期事件。如果有太多工作在主线程中进行,则应用可能会挂起或运行速度变慢,从而导致用户体验不佳。任何长时间运行的计算和操作(例如解...

2020-03-02 21:12:50 2339

原创 Android Jetpack架构组件(七)Room使用篇

前言前面几篇讲解了Lifecycle,LiveData,ViewModel,有了前面这几篇的铺垫,就能引出我们今天要讲解的Room了,Room是一个数据库访问组件,对SqLite数据库做了友好的封装,使我们在编码的时候,只需要注重逻辑的部分即可,数据库就交给Room去流畅的访问即可。Room使用步骤 > Github项目地址1 添加依赖build.gradle {apply p...

2020-03-01 11:38:50 1848

原创 Android Jetpack架构组件(六)ViewModel使用和源码篇

前言

2020-02-27 22:17:39 1460

原创 Android Jetpack架构组件(五)LiveData原理篇

前言上一篇我们讲解了Jetpack中LiveData使用篇, 本片我们从源码角度来分析LiveData.是如何实现的。LiveData源码分析我们就以上一篇的基本使用入手来分析源码class TestActivity : AppCompatActivity() { private val TAG by lazy { TestActivity::class.ja...

2020-02-25 00:03:40 859

原创 Android Jetpack架构组件(四)LiveData使用篇

前言:上一篇我们讲解了Jetpack中Lifecycle原理篇, 本片我来讲讲Jetpack中的另一个重要组件LiveData.LiveData概述LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveDat...

2020-02-24 01:04:16 1043

原创 Android Jetpack架构组件(三)Lifecycle原理篇

前言上一篇讲述了Jetpack中的Lifecycle的使用,这一篇我们从源码角度来分析一下它是如何实现的。源码解析(基于最新的2.2.0版本)在上一篇的Lifecycle使用篇中我们知道了怎么使用,这里我们把源码部分贴出来,我们从使用的角度来分析源码是如何实现的:class DetailActivity : AppCompatActivity() { override fun...

2020-02-18 22:24:16 1526 1

空空如也

空空如也

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

TA关注的人

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