自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 资源 (2)
  • 收藏
  • 关注

原创 Android Process管理(进程管理) 详解

深入理解Android5.0系统

2022-07-29 19:58:33 2513 1

原创 Android 低电量关机原理 详解

首先电量过低时,healthd会触发batteryService类中的shutdownIfNoPowerLocked方法:private void shutdownIfNoPowerLocked() { // shut down gracefully if our battery is critically low and we are not powered. // wait until the system has booted before attempting to display

2022-04-20 08:51:12 1465

原创 Android 电池管理(BatteryService) 详解

SystemServer在启动BatteryService时,一次会调用它的构造函数,onStart,onBootPhase方法;解析来我们分析一下这些方法:1.Constructor方法:public BatteryService(Context context) { super(context); mContext = context; mHandler = new Handler(true /*async*/); //电源呼吸灯 mLed = new Led

2022-04-19 22:47:43 6108 1

原创 Android 启动系统Service(SystemService)的流程 详解

系统Service类一般都要继承SystemService类,在SystemServer类中启动;我们以WifiServiceImpl类为例:1.startOtherServices(){ .... mSystemServiceManager.startService(WIFI_SERVICE_CLASS); ....}该方法执行SystemServiceManager中的startService方法来创建Service的实例2.SystemServiceManager类的startSer

2022-04-18 22:52:50 3244

原创 Android Activity,window和View的联系 详解

将view添加到window中:activity.makeVisible方法: wm.addView(mDecor, getWindow().getAttributes());该方法将DecorView添加到Window上,将view和window之间建立了联系;Phone对象:再attach方法中:新建一个PhoneWindow对象,同时得到一个WindowManager对象,WindowManager是一个抽象类,这个WindowManager的具体实现是在WindowManagerImpl

2022-04-10 23:47:32 2729

原创 Service 启动模式底层原理详解

Sevice的启动状态主要适用于后台计算的任务;Intent intentService = new Intent(this, MyService.class);startService(intentService);启动模式的流程分析:1.首先从ContextWrapper的startService开始:public ComponentName startService(Intent service) { return mBase.startService(service);}2.

2022-04-05 23:44:18 235

原创 java AQS之源码详解

AQS的基本数据结构为Node;Node的结构解析:SHARED:代表一个标识位,指示节点使用共享模式;EXCLUSIVE:表示节点使用的是独占模式等待;CANCELLED:等待状态,表示线程已经被取消(节点因为超时或者被打断而取消)SIGNAL:等待状态值,表示后继的线程需要取消阻塞;prev:当前节点的前驱节点;next:当前节点的后续节点;thread:当前节点持有的线程,构造方法中初始化,使用完毕之后设置为null;nextWaiter:指向下一个处于阻塞等待的节点;lock方

2022-04-02 10:21:09 812

原创 Java并发编程 Condition源码详解

Condition概述:Java对象有一组监视器方法:wait,notify,而synchronized本身就是利用虚拟机提供的对象监视器(objectMonitor)实现同步,这些方法与synchronized配合实现了等待和通知模式,Conditon提供了类似synchronized监视器的方法,利用AQS条件队列与Lock配合实现了等待和通知模式;Condition内部是AQS的内部类利用条件队列实现阻塞和通知线程的效果;当一个线程在调用了await方法以后会被阻塞,调用signal方法唤醒,这种

2022-03-30 11:39:32 435

原创 FutureTask 源码分析

FutureTask介绍:FutureTask是一个RunnableFuture<V>,而RunnableFuture实现了Runnable又实现了Future<V>这两个接口;FutureTask源码分析:首先分析run方法:public void run() { if (this.state == 0 && UNSAFE.compareAndSwapObject(this, runnerOffset, (Object)null, Thread.c

2022-03-29 23:15:40 150

原创 ArrayList和LinkedList的效率 详解

ArrayList和LinkedList的增删效率可以分为三种情况:在头部增删,在中间增删和在尾部增删;当头部增删时:LinkedList的效率是要优于ArrayList的,因为ArrayList要进行大量的数据迁移;在中间增删时:LinkedList的效率要低于Arraylist的,因为Linked在从头部头部或者尾部遍历找到对应的节点,而ArrayList迁移的数据就比较少了;在尾部增删时:1.当数据量较少时,两种的效率都很高,只需要在尾部添加元素即可;2.当添加的元素有一定规模时,Lin

2022-03-21 22:02:27 1040

原创 Java ArrayList类(集合)

ArrayList类和数组的区别是:ArrayList类数组的长度是可以变化的,而且ArrayList是一个泛型容器;同时ArrayList中只能存储引用类型,而不能存储基本类型;原因是:ArrayList数组中存放的是地址。创建集合对象:ArrayList a = new ArrayList<>(); //右边的<>内可以不写类型;在对象中添加数据:a.add(“...

2022-03-21 21:47:48 596

原创 java 类加载机制

在java代码中,类型的加载,连接,初始化过程都是在程序运行期完成的。java虚拟机的类加载机制:我们的源代码经过编译器编译成字节码之后,最终都要加载到虚拟机之后才能运行。虚拟机把描述类的数据从.class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制;类型的加载:类型:Java源代码通过编译后的class文件;...

2022-03-20 22:27:21 190

原创 Glide 缓存流程 详解

Glide使用缓存的目的是:1.减少流量的消耗,加快效应速度;2.Bitmap的创建和销毁比较耗内存,可能会导致频繁的GC操作;使用缓存可以更加高效的加载Bitmap,减少卡顿;Glide的缓存流程:可以分为内存缓存和磁盘缓存,其中内存缓存可以分为弱引用缓存和LRU缓存;内存缓存的主要作用时防止应用重新加载图片数据到内存中;而硬盘缓存的主要作用是防止应用重复从网络或其他地方下载和读取数据;缓存执行的顺序是:取顺序:弱引用,LRUCache,磁盘存顺序:磁盘,弱引用,LRUCache内存

2022-02-26 22:26:18 514

原创 IO流 多路复用 详解

IO多路复用是建立在内核提供的多路分析函数select基础之上,使用select函数可以避免同步非阻塞IO模型轮询等待的问题;用户首先将需要进行IO操作的socket添加到select中,然后阻塞等待select系统调用返回;当有多个客户连接,此时select函数监听多个socket对象,socket1,socket2,socket3等;当其中有一个发送消息回来,当前线程就会从select的阻塞状态中返回,然后就调用read读取收到消息的socket对象,之后又会回到select中阻塞,等待下一个

2022-02-21 21:59:11 117

原创 android OkHttp 详解

在Android Studio项目中,使用okHttp时要添加:compile 'com.squareup.okhttp:okhttp:2.4.0'OkHttp的使用教程:OkHttpClient mOkHttpClient = new OkHttpClient(); //创建okHttpClient对象final Request request = new Request.Builder().url("https://baidu.com").build() //创建一个Request对象,设

2022-02-21 21:58:29 3988

原创 Android LinearLayout和RelativeLayout 详解

两者的共有属性:控件间距:1.android:layout_marginLeft 2.android:paddingLeft控件显示位置:1.Android:gravity2.android:layout_gravity仅RelativeLayout有效地属性:Android:layout_alignParentLeft="true" //在布局的左边Android:layout_toRightOf="@id/button1" //在控件button1的右边,不仅仅是紧靠着And

2022-01-02 23:56:33 1359

原创 android ConstraintLayout布局 详解

ContraintLayout布局的约束性:约束布局,控件之间,控件与父布局之间具有约束关系,控件的位置是按照约束来计算的;子view通过一个个约束的属性,来决定自己的位置;RelativeLayout可以实现对控件的约束,实现起来相对简单;而LinearLayout虽然使用简单,但是会加深布局深度层级,影响app的解析效率问题;ContraintLayout的其他属性和relativelayout基本一致,同时ContraintLayout可以约束控件的比例(LinearLayout中的weight

2022-01-02 23:48:21 1837

原创 Android启动模式之ActivityStack,TaskRecord,ActivityRecord和ActivityStackSupervisor 详解

ActivityRecord:一个ActivityRecord对应着一个Activity,保存着一个Activity的所有信息;但是一个Activity可能会有多个ActivityRecord;因为Activity可能会被启动多次,主要是取决于Activity的启动模式;TaskRecord:一个或者多个ActivityRecord组成,这就是我们经常说的任务栈或者是task栈,具有先进后出的特征;ActivityStack:使用于管理TaskRecord的,包含了一个或者多个TaskRecord,具有

2022-01-01 23:33:30 2173

原创 设计模式 代理模式和装饰器模式的区别

代理模式和装饰器模式功能很相似;装饰器模式:装饰着和被装饰者搜实现同一个接口;代理模式:代理类和真实类都实现同一个接口;区别是:装饰器模式主要是强调对类中代码的扩展,而代理模式则更偏向于委托类的访问限制(可以隐藏客户对象的具体信息);也就是说采用代理模式,一般会在代理类中创建一个对象的实例(这样可以隐藏客户的信息,但不具有扩展性,也就是说客户的类型会在代理类中写死,这样导致每个客户都要一个单独的代理类);而装饰器模式,通常是将原客户对象作为参数传递给装饰器的构造函数(这样扩展性强,但是暴露了客..

2021-11-01 00:00:07 180

原创 OkHttp 连接池 详解

OkHttp框架采用的是Socket连接,底层涉及到Http协议的封装和解封,TLS/SSL安全协议的封装等;连接池主要涉及到几大类:ConnectionPool,RealConnection,StreamAllocation,ConnectionInterceptor;1.ConnectionPool类:该类是OkHttp的连接池,连接池可以有效地提高连接的使用效率;主要涉及到添加,获取,删除连接等功能;2.RealConection类:RealConnection是Connection的

2021-10-26 23:59:03 3041

原创 android Context类的意义

Activity通过Context接口去访问Android系统的服务于资源,主要包括:1.获取应用相关的信息ApplicationInfo getApplicationInfo()String getPackageName()Looper getMainLooper()int checkPermission(String permission, int pid, int uid)2.获取系统/应用资源:AssetManager, PackageManager, Resources, Syste

2021-10-25 00:05:29 64

原创 RxJava框架原理分析

//调用call方法时的Subscriber对象,其实是调用subscribe方法时传入的,然后保存下来,在调用call方法时传入Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { //subcricber对事件的响应逻辑

2021-10-24 23:31:22 1174

原创 Android 深入理解OnHttp框架

深入理解okhttp框架

2021-10-24 23:00:20 2172

原创 java 反射机制之Method类

1.Method.getAnnotations():用于获取方法上的注解;2.method.getGenericParameterTypes():用于获取方法的参数类型;3.method.getParameterAnnotations():用于获取方法的参数上的注解;

2021-10-17 18:00:30 199

原创 Android 跨进程通信Binder

Binder机制-详解在操作系统中为了保证安全性和独立性,在用户态进程之间是独立的,所以如需要进程间数据交互和通信,将进程A的数据拷贝到内核态,然后进程B将进程A的数据从内核态拷贝到用户态;Binder的作用是连接两个进程,实现了mmap方法进行系统调用(进行通信的核心原理是内存映射),主要负责创建数据接收的缓存空间和管理数据接收缓存;Binder机制在Android中的具体实现原理:...

2021-10-15 13:59:27 96

原创 Android Handler类的源码详解

Handler机制主要分为两部分:发送消息和处理消息;发送消息:可以在任意的子线程中进行操作;处理消息:在主线程中进行操作,主要是通过Looper类轮询MessageQueue队列来处理消息的;发送消息:1.调用sendMessage方法,将消息传递到MessageQueue队列中2.使用handler.post(new Runnable(){.....}) //作为message.callback的值,传递给MessageQueue队列处理消息:在主线程ActivityThread类中

2021-10-10 23:43:56 82

原创 Android EventBus使用方式 详解

EventBus是一种用于Android的发布/订阅事件总线。他可以简化应用组件间的通信,解耦事件的发送者和接受者,避免复杂和容易出错的依赖和生命周期的问题;EventBus是用了发布者/订阅者模式:添加依赖:dependencies { ... compile 'org.greenrobot:eventbus:3.1.1'}EventBus的使用,一共分为三步:1.定义事件:public class MessageEvent{.....}2.订阅事件:订阅者需要定义

2021-10-10 10:29:36 875

原创 Java 多线程(一)线程的生命周期 详解

线程的生命周期分为创建,就绪,运行, 阻塞,销毁5个状态;1.创建状态:在使用new关键字创建Thread类的时候,该线程对象就处于新建状态,这个状态一直保持到调用start方法的时候;2.就绪态:当调用线程的start方法时,会调用系统的本地方法,系统由运行态切换到内核态,来开辟一个线程,此时线程进入就绪态,该线程位于就绪队列中等待获取CPU的时间片;由于创建线程需要由运行态切换到系统内核,这是一个耗时的过程,所以在需要多次创建线程的时候,推荐使用线程池;3.运行态:如果就绪态的线程抢

2021-09-19 23:55:25 145

原创 native-react 组件的props和state 数据的传递

props和state的区别是:props只能读,是从外部传到内部;而state可以修改,是内部状态值的修改

2021-06-19 14:30:53 356

原创 react-native 事件发射器

为了向js传递事件我们需要在原生页面用到RCTDeviceEventEmitter,它是原生模块和js之间的一个事件发射器;//eventName是要发射的事件的名称,params为事件携带的参数;private void sendEvent(ReactContext reactContext,String eventName, @Nullable WritableMap params) { reactContext.getJSModule(DeviceEventManagerModule.RC

2021-06-19 09:58:22 138

原创 react-native 组件的生命周期

自定义组件必须实现render方法,react-native组件的生命周期:1.初始化:getDefaultProps:全局调用一次;constructor(getInitalState):组件实例创建时调用的第一个函数,主要适用于初始化state;componentWillMount:render函数:用于组件渲染函数一般props和state变化会重新渲染组件);会返回一个Virtual DOM,只允许返回一个最外层容器组件componentDidMount:在render渲染之后,Re

2021-06-18 14:52:08 116

原创 Java CAS

CAS(compare and swap):比较并且交换, 用于实现多线程同步的原子性,是一条CPU的并发原语;原理是:在读取到主内存的数据后,保存该数据,然后对读取主内存的数据进行操作。在操作完毕后写回给主内存的时候,检查现在主内存的数去和开始读取的数据是否相同,如果相同,把操作后的数据写到主内存中,执行成功,否则执行失败,重新执行;CAS的底层原理:unsafe+自旋锁1.自旋锁:2...

2020-05-07 20:06:29 119

原创 Java Synchronized

Synchronized是通过monitorenter和monitorexit两个指令(对象监视器),可以同时保证Synchronized修饰的代码块在同一时间内只能被一个线程访问,即可保证不会出现CPU时间片在多个线程间切换,即可以保证原子性;...

2020-05-07 20:05:37 76

原创 linux中常用的命令

目录操作的命令:ls: 表示列出当前路径下的文件信息选项: -a: 表示可以查看到隐藏的文件 -l : 用于显示文件的详细信息(包括文件创建的时间等) -R:用于递归的显示子目录的目录结构pwd(print working directory): 查看当前目录的绝对路径cd(change directory): 切换工作目录cd -...

2019-11-10 20:00:01 45

原创 linux中的各个目录的意义

根目录(/)是整个系统最重要的目录, 因为不但所有的目录是由根目录衍生出来的,同时根目录还与开机,/还原/系统修复等动作有关。由于开机时需要特定的开机软件,核心文件,开机时所需要的程序,函式库,等等文件。若系统出现错误,根目录也必须要包含能够修复文件系统的程序才能行。因为根目录是如此的重要,所以在FHS的要求方面,他希望根目录不要放在非常大的分区,因为越大的分区你会放入越多的数据。...

2019-11-05 18:30:04 149

原创 linux shell的基本操作

linux中的shell是一个命令解析器,将用户的命令解析为操作系统所能理解的指令,从而实现用户和操作系统的交互;shell作为命令解析器的本质是:通过你输入的输入的命令来调用相应的程序;一.shell的编程技巧:1. 自动补齐机制:输入命令前的几个字母,然后按Tab键会自动补齐命令。2. ctrl+r :用于增量搜索,通过输入关键字来搜索以前用过的命令。3. ctrl+k:...

2019-11-05 18:13:22 159

原创 进程,线程

1:进程的上下文切换进程的上下文切换是指:当A进程要切换到B进程中的时候, 先保存A进程的上下文(例如A进程的入口等),然后将B进程的上下文加载到寄存器中,这个过程就是进程的上下文切换。...

2019-10-19 16:50:08 70

原创 C++ STL空间配置器

为何要设计空间配置器:小的内存的申请或释放会导致内存碎片的问题。如果任由STL中的容器自行的通过malloc或new来分配内存空间,那么频繁的分配和释放内存空间会导致产生许多内存碎片。可能堆中空闲的内存之和比较大,但是申请新的内存的时候没有足够大的连续内存可以使用,这会导致内存分配失败。小的内存的频繁的申请或释放会导致性能的问题。开辟内存空间的时候,分配器会需要花费时间寻找空闲的内存块,...

2019-09-16 19:59:58 112

原创 C++ STL仿函数

仿函数就是函数对象,是一个对象具有函数性质,使这个对象能够像函数一样被调用(就是生成该对象的类中重载了()运算符)。一般仿函数要和STL中的算法相结合使用。仿函数分为两种:第一种为一元仿函数,就是功能类似于一元操作符的函数(例如取反功能)。第二种为二元仿函数,功能类似于二元操作符的函数(加号)。ST中内建的仿函数:1. 算术类的仿函数:plus<T> : 加法minus&l...

2019-09-15 20:12:07 168

原创 python threading模块

线程是CPU分配的基本单元。当一个程序执行时,这个程序就变成一个进程,一个进程相当于一个或者多个线程。例如:import threadingdef thread1(name): print(name)#target表示要执行的任务,args表示要传入的参数m1 = threading.Thread(target = thread1, args = ("liming"))m2 =...

2019-08-14 18:51:53 60

标准正太随机数

分享给程序入门的小学弟们,希望对你们有用,多谢指点

2018-08-03

求曲线的四阶拟合

在做图像处理过程中的解决问的一个小程序,本程序很简单,希望大佬们给与指点

2018-08-03

空空如也

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

TA关注的人

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