自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(34)
  • 收藏
  • 关注

原创 使用trace文件分析ANR

全称:Application Not Responding,也就是应用程序无响应。Android系统中,ActivityManagerService(简称)和WindowManagerService(简称WMS)会检测App的响应时间,如果App在特定时间无法相应屏幕触摸或键盘输入时间,或者特定事件没有处理完毕,就会出现ANR。ANR信息在ActivityManagerService类中的appNotResponsding函数中输出。

2024-02-05 12:16:14 911

原创 Activity的启动流程

小伙伴们面试的时候是不是被问过Activity的启动流程很多啊。那我们就来看看吧。个人感觉这类文章代码细节太多,反而容易迷失在源码调用之中,从而忽略了Activity启动过程的本质。所以本文就简单地定性地对Activity启动过程进行描述,不会贴上大篇幅的源码。本文是根据Android11.0系统源码讲述的。

2024-02-04 05:59:22 1174

转载 Kotlin入门学习

和Java中的接口定义类似。

2024-02-01 16:06:53 40

原创 ATM和AMS启动流程

AMS 在初始化的过程中,也伴随着了ATMS(ActivityTaskManagerService)的初始化。回过头来看ActivityTaskManagerService Lifecycle类中的onStart方法里面publishBinderService,这个方法做了什么呢。Lifecycle构造函数中初始化了AMS,和在ATM中的Lifecycle类似,创建了ATM服务。最终调用的是ServiceManager addService,也就是将ATM这个服务添加到ServiceManager中。

2024-01-29 12:00:22 401

原创 system_server进程创建流程

Zygote.forkSystemServer 返回的是一个int型的pid,如果pid不等于0,代表的是在父进程中执行,即。记得上一篇Zygote进程创建里面提到过,forckSystemServer创建system_server进程。返回的Runnable对象,执行run, 执行system_server main 方法,然后return了。最终执行handleSystemServerProcess,是在system_server进程中执行。Zygote进程,如果pid等于0,代表在子进程中执行。

2024-01-27 20:57:57 389

原创 Zygote的启动流程

preload()方法主要预先加载了framework中通用的类和资源(core/res/res/values/arrays.xml)、openGL、本地共享库、webView的一些资源。在zygote进程对应的文件是app_main.cpp文件,在app_main.cpp文件的main()方法中先解析了init.rc中配置的参数并根据配置的参数设置zygote的状态。startVM()方法多了大量的命令参数拼接最后通过JNI_CreateJavaVM()方法创建虚拟机。

2024-01-27 09:49:32 852

原创 Android 系统启动过程

当按下电源时,引导芯片代码会从预定义的地方(固化在ROM) 开始执行,加载引导程序BootLoader到RAM,然后执行。启动内核的第一个进程idle(pid=0),idle进程是Linux系统第一个进程,是init进程和kthreadd进程的父进程。

2024-01-25 14:05:34 2101

转载 Binder机制 在Android中的具体实现原理

机制在 中的实现主要依靠 类,其实现了 接口 下面会详细说明实例说明:进程 需要调用 进程的函数 即:代码分析:注册服务后,驱动持有 进程创建的实体 此时,进程与 进程已经建立了连接进程 根据获取到的 信息(代理对象),通过驱动 建立与 该所在进程通信的链路,并开始使用服务步骤1: 进程 将参数(整数a和b)发送到进程步骤2:进程根据进要求 调用 目标方法(即加法函数)步骤3:进程 将目标方法的结果(即加法后的结果)返回给进程总结 下面,我用一个原理图 & 流程图来总结步骤3的内容

2024-01-23 16:58:12 27

原创 浅谈 Java 数组链表

知道了元素的数据类型,知道了内存空间是连续的,那我们肯定也能想到如何去根据索引去获取数组对应的元素了,比如说我获取number[2]的数据,那么我们只需要根据 下标位*数据占用的大小,这样计算就可以得到下标位为2的数据在内存中的位置了,当然真正的计算过程是通过下标位计算指针的偏移量的方式得到的,但逻辑上却是一样的,同时在申请数组的时候还会记录数组在内存开始标记位和结束标记位,通过开始标记位和结束标记位,然后通过索引加上数据类型的大小计算出偏移量就能读取到数组对应下标位的数据。

2024-01-22 15:48:31 844

转载 Java基础(4)

在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者实际参数类型可以预知的情况下进行的。泛型的本质是参数化类型,在不创建新的类型的情况下,通过泛型指定不同的类型来控制形参具体限制的类型。Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。

2024-01-22 11:00:50 21

转载 Java基础(3)

计算下标的算法很简单,hash值 和 (length-1)按位与,使用length-1的意义在于,length是2的倍数,所以length-1在二进制来说每位都是1,这样可以保证最大的程度的散列hash值,否则,当有一位是0时,不管hash值对应位是1还是0,按位与后的结果都是0,会造成散列结果的重复。该位置有节点,则遍历该节点以及后续的节点,比较key值,相等则覆盖,没有就新增节点,默认使用链表,相连节点数超过8的时候,在jdk 1.8中会变成红黑树。List 接口实例存储的是有序的,可以重复的元素。

2024-01-21 18:26:22 20

转载 Java基础(2)

多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作如图所示:

2024-01-21 12:11:52 278

转载 Java 基础(1)

一、Java基础1、java基本数据类型和引用类型1.基本数据类型:整型:byte,short,int,long浮点型:float,double字符型:char布尔型:boolean其中:byte占一个字节short、char占两个字节int、float占四个字节double、long占8个字节boolean只有true和false。类、 接口、 数组、 枚举、 注解。

2024-01-19 16:32:57 19

转载 Android跨进程通信:Binder机制原理

在讲解Binder前,我们先了解一些Linux的基础知识。

2024-01-19 11:31:19 32

原创 Android事件机制探讨(2)

ACTION_DOWN分发到View的onTouch,此时返回值为false,没有消费事件,继续执行onTouchEvent方法,该返回一样返回false,事件再往上传递给ViewGroup的onTouchEvent方法,因为我们为ViewGroup设置了setOnTouchListener,所以在执行onTouchEvent之前会先执行onTouch,而我们在onTouch方法返回了true,表明该事件被消费,接着传递终止,所以ViewGroup的onTouchEvent方法并没有被执行。

2024-01-17 15:21:44 372

原创 Android 事件机制探讨(1)

事件的传递主要有三个方法:dispatchTouchEvent(事件分发)、onInterceptTouchEvent(事件拦截)、onTouchEvent(事件消费)。

2024-01-15 13:58:57 985

转载 浅谈Android Handler 机制实现与工作原理(2)

是Linux 2.6提供的一种系统调用,它可以用来实现事件通知。eventfd包含一个由内核维护的64位无符号整型计数器,创建eventfd时会返回一个文件描述符,进程可以通过对这个文件描述符进行read/write来读取/改变计数器的值,从而实现进程间通信。(mac完全用不了这个epoll和eventfd,尴尬)

2024-01-07 15:13:19 72

原创 浅谈Java 虚拟机(1)

我们知道,一个JVM实例的行为不光是它自己的事,还涉及到它的子系统、存储区域、数据类型和指令这些部分,它们描述了JVM的一个抽象的内部体系结构,其目的不光规定实现JVM时它内部的体系结构,更重要的是提供了一种方式,用于严格定义实现时的外部行为。因为Java代码是结构化的,因此总可以把某个方法的所有的异常处理器都按序排列到一个表中,对任意可能的程序计数器的值,都可以用线性的顺序找到合适的异常处理块,以处理在该程序计数器值下发生的异常情况。当线程执行Java方法的时候,它包含该线程正在被执行的指令的地址。

2023-12-21 09:28:43 825

转载 Java线程安全总结(2)

难道栈不是工作内存吗?但是堆,并不是一个简单的概念,堆区又划分了很多区域,为什么堆划分成这么多区域,这是为了JVM的内存垃圾收集,似乎越扯越远了,扯到垃圾收集了,现在的jvm的gc都是按代收集,堆区大致被分为三大块:新生代,旧生代,持久代(虚拟的);在这里我说的是jvm的内存模型,是动态的,面向多线程并发的,沿袭JSL的“working memory”的说法,只是不想牵扯到太多底层细节,因为 《线程安全总结》这篇文章意在说明怎样从语法层面去理解java的线程同步,知道各个关键字的使用场 景。

2023-12-15 09:35:41 29

转载 Java线程安全总结(1)

3 此时,来了一个B线程对象,调用plate.getEgg方法,eggs.size()不为0,顺利的拿到了一个鸡蛋,还执行了notify()方法,唤 醒锁的阻塞队列的线程,此时阻塞队列有一个A线程对象,唤醒后,它进入到就绪队列,就绪队列也就它一个,因此马上得到锁,开始往盘子里放鸡蛋,此时盘子是 空的,因此放鸡蛋成功。同样,x有可能为11,如果x是一个银行账户,线程a存款,线程b扣款,显然这样是有严重问题的,要解决这个问题,必须保证线程a和线程b是有序执行的, 并且每个线程执行的加1或减1是一个原子操作。

2023-12-13 10:46:23 43

原创 浅谈Android Handler 机制实现与工作原理(1)

Handler在android项目中经常用到,之前转载过一篇关于Handler的文章,不过个人觉得比较概念性,本篇主要是从源码上解析Handler工作的原理机制。下面是我从网上看到的一个Handler工作流程图,如下:首先这个是Handler的默认构造方法,this进入的是下面的方法在Handler的构造方法中,首先通过Looper.myLooper()方法获取当前线程...

2020-02-03 13:36:26 500 1

原创 AppCan 个推推送消息

首先先了解一下AppCan平台,在这里就不多说了,地址在http://newdocx.appcan.cn。第一步:在个推官网注册,https://www.getui.com/;点击开发者中心,进去后,看左侧菜单栏,选择应用管理点击创建应用,填写相应信息,这样就可以创建一个应用了。第二部:在个推官网创建应用,地址:http://www.appcan.cn/;进...

2019-09-19 15:00:26 392

转载 github入门到上传本地项目

github入门到上传本地项目 (转载)

2019-02-18 16:08:23 167

原创 Android 应用程序自动更新

    大体思路是,比较服务器版本和当前应用程序的版本号(versionCode)或者(versionName),如果系统版本号大于本地版本号,提示更新.其中要注意的是,如果用户每次没有更新,而是取消,那就容易造成android设备里面堆积大量下载下来的apk.做法其实很简单,只要每次更新前,删除历史纪录就好.你也可以记录下downLoadId,直接安装已经下载下来的apk,不需要再去从服务器...

2019-02-15 15:07:27 947

转载 AndroidJNI(Java Native Interce)

一、JNI(Java Native Interface) 1、什么是JNI:              JNI(Java Native Interface):java本地开发接口              JNI是一个协议,这个协议用来沟通java代码和外部的本地代码(c/c++)              外部的c/c++代码也可以调用java代码       2、为什么使用...

2019-01-20 20:44:11 190

转载 Android Handler通信

一  Android中使用Handler场景      在开发中更新我们刷新视图都需要在主线程中更新,子线程是不支持更新视图操作的。所以当我们做一些耗时操作的时候可以不能马上得到反馈刷新UI,比如下载文件或者下载图片这些操作都比较耗时,我们一般会重新创建一个子线程异步处理耗时操作,这样就不会堵塞主线程导致卡顿的情况。这个时候Handler就起到了作用。我们可以用Handler Looper M...

2018-10-29 10:32:56 517

原创 AndroidStudio 连接 Android系统开发板

一  开发板的网络环境配置:1.用串口线或者串口转usb线将pc端与android开发板端连接起来2 将android开发板接入公司局域网;简单点来根网线和一个TP_Link,接入就可以.3.打开下载好的Xshell,界面如下(1)点击新建按钮,弹出如下界面,(红色箭头指出需要修改的地方将协议修改为SERIAL) 设置完成,点击确定,在会话窗口点击连接,如果连...

2018-10-26 17:00:50 4252

原创 Android 中导入项目乱码或者手机上显示乱码解决方案

导入了Eclipse项目,打开文件发现注释都是乱码,上网查了一下,解决方法如下:首先打开AndroidStudio目录如图设置即可:然后运行项目,显示的是乱码 然后我在gradle文件中加了android {compileOptions.encoding = "GBK"}重新运行,问题解决了....

2018-10-17 10:32:44 1000

原创 Could not find com.android.tools.build:gradle:3.2.0.

最近遇到这个错误, 主要是gradle版本的问题:解决办法:Setting->Build,Execution,Deployment->Gradle->Android Studio ,然后把 Enble embedded Maven repository 前面的单选框勾选上。 ...

2018-10-16 16:39:00 30132 17

原创 AndroidStudio 环境搭建和安装

一  首先确保电脑是否安装了JDK,打开CMD,输入"java -version",如图所示, 代表已经安装了JDK.如果未安装,可以直接下载,地址:https://www.oracle.com/technetwork/java/javase/downloads/index.html安装完毕后,配置环境变量,依次点击我的电脑-属性-高级系统设置变量:JAVA_HOME  变...

2018-10-16 14:27:40 192

原创 MVC5项目发布到IIS

1.右击项目,点击发布(本人用的是vs2017)2 选择要发布的目标位置,简单说就是你想把发布生成的文件保存到哪里。本人在F盘建了个MVCPublishToIIS的文件夹。   发布方法选择文件系统(File System)  3 点击下一页继续   配置选择Release   发布后文件夹里面的文件 4 发布到IIS,首先检查计

2017-10-29 19:22:24 10341 2

原创 vscode debugger for chrome

1.首先安装 debugger for chrome这个插件2 配置launch.json3 再按F5启动,就可以启动Chrome,并且在VSC里Debug调试代码了

2017-10-17 23:01:18 1596

原创 .net中后台定时执行任务-FluentScheduler

最近在网上看到有关.NET后台如何定时执行任务的一些文章,个人觉得FluentScheduler比较易上手。下面写了一个关于这方面的小demo. 首先在Nuget程序包中搜索FluentScheduler,附加到项目中。  新建MyRegistry类,该类是用于注册管理Job的。  新建MyJob类,用于定时执行的操作,主要包括Excute和Stop两个方法

2017-01-23 09:37:00 6530

原创 .NET 中ajax如何调用后台.cs文件中的方法

最近在改一个项目,其中改到一个需求是,计算出勤率。就是输入应到人数,实到人数之后自动带入出勤率。以前是在服务器端事件里面写的,这样有个弊端,就是每次都会autoback,体验效果很不友好。通过textbox的change事件,ajax调用后台的方法,可以做到无刷新的效果。这里附上截图:代码1:代码2:其中代码2中的

2016-12-30 17:10:21 2467

空空如也

空空如也

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

TA关注的人

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