概述 本文记录 Android 的消息机制在 java 层的原理分析.
背景 在学习 Binder,IPC 的时候,涉及到消息机制,顺带整理一下.
概述 进程:系统进行资源分配和调度的基本单位. 在 Andrid 中,对于每个 App 运行时前,系统都会为其创建一个进程,App 就运行在一个进程中.
线程: 作为程序执行的最小单元。 该线程与 App 所在进程之间资源共享,从 Linux 角度来说进程与线程除了是否共享资源外,并没有本质的区别,都是一个 task_struct 结构体,在 CPU 看来进程或线程无非就是一段可执行的代码.
Android 主线程: 一个进程中就一个主线程,这个主线程负责更新 UI.
Why 目前对为什么需要消息机制,还没认真的研究,个人觉得系统的运转和程序的运行说到底都是消息的传递,如何让这些程序的消息传递高效地的运转,于是产生了消息机制一说.
What 什么是消息机制?消息机制的三大要素:
消息队列 消息循环 消息类型 How 在 Android 中是如何使用消息机制的? Android 中典型的消息机制就是 Handler. 以下是我们平时使用 Handler 经常使用的方式.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 private Handler mHandler = new Handler(new Callback() { @Override public boolean handleMessage(Message msg) { System.
概述 本文记录注解 Annotation 的概念和使用.
Annotation 注解 Why 需要注解 在代码中常有些重复的代码,这些代码纯手工太耗时。可以通过一定的标记,然后处理即可。
What 是注解? Annotation 分类 标准 Annotation 包括 Override, Deprecated, SuppressWarnings,是 java 自带的几个注解,他们由编译器来识别,不会进行编译,不影响代码运行。 元 Annotation @Retention, @Target, @Inherited, @Documented,它们是用来定义 Annotation 的 Annotation。也就是当我们要自定义注解时,需要使用它们。 自定义 Annotation 自定义的 Annotation。 自定义的注解也分为三类,通过元Annotation - @Retention 定义: @Retention(RetentionPolicy.SOURCE) 源码时注解,一般用来作为编译器标记。如 Override, Deprecated, SuppressWarnings。 @Retention(RetentionPolicy.RUNTIME) 运行时注解,在运行时通过反射去识别的注解,这种注解最大的缺点就是反射消耗性能。 @Retention(RetentionPolicy.CLASS) 编译时注解,在编译时被识别并处理的注解,相当于自动生成代码,没有反射,和正常的手写代码无二。 Annotation 的工作原理 APT(Annotation Processing Tool) 根据不同类型的注解,采取不同的处理方式,对于 SOURCE 类型的注解,它只会存在代码中,当进行编译成 class 的时候,就会被抛弃了。 RUNTIME 类型的则一直存到 class 文件中,一直存在虚拟机的运行期。CLASS 类型的注解只存到编译期,会根据 处理器的要求进行处理,生成代码或者其他处理方式,处理完只会,就不会存在了,而如果生成了文件,则会一直存在,被打包。
术语解释 Element: 表示一个程序元素,比如包、类或者方法。每个元素都表示一个静态的语言级构造(不表示虚拟机的运行时构造)。 元素应该使用 equals(Object)方法进行比较。不保证总是使用相同的对象表示某个特定的元素。要实现基于 Element 对象类的操作,可以使用 visitor 或者使用 getKind() 方法的结果。使用 instanceof 确定此建模层次结构中某一对象的有效类未必可靠,因为一个实现可以选择让单个对象实现多个 Element 子接口。 在 JDK 1.
概述 本文记录 Markdown 写作时常用的一些语法.
Why 平时人们都会进行一些简单的笔记记录,这些文字如果用 Word 就会感觉太复杂,用 txt 又显得单薄,一点格式都没有,不利于书写。自然人们希望有一种方法,能消除这两个缺点的方法,既能有常用的格式,又能方便记忆,简单快捷. Markdown 是满足这种需要的,所以记录总结一些常用的 Markdown 符号,方便记忆.
What Markdown 是一种轻量级的「标记语言」,Markdown 简单快捷,导出格式也随心所欲,你可以导出 HTML 格式的文件用来网站发布,也可以十分方便的导出 PDF 格式,方便阅读。
How 1. 标题级别的 语法:
# 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题
标题的级别根据#的个数来区分。正常的文本内容不需要取管,直接输入即可。
效果:
一级标题 二级标题 三级标题 四级标题 五级标题 ####### 六级标题
2. 序列效果 无序序列语法:
* 包含的要点 * 包含的要点 - 包含的要点 - 包含的要点
无序序列效果:
包含的要点 包含的要点 包含的要点 包含的要点 有序序列语法:
\1. 第一点 \2. 第二点 \1. 第三点
概述 本文记录常用 git 的功能和命令.
Git实践笔记 Why 一年多前一边工作一边学,做的笔记,后来换了工作,改用SVN,git也就生疏了,最近公司打算换git了,正好重新整理一下笔记.
What git是目前最好的版本控制工具,是一种动态异步的版本控制工具,对于版本控制的发展历程,可以参考别的文章.目前各个开源管理平台基本上都是用的git,git是必备的技能.
简介 Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!大写的牛逼!一个月之内,Linux系统的源码已经由Git管理了! 起初的git只能在linux和Unix上运行。
安装git 在Linux上安装Git 命令行下输入,sudo apt-get install git,直接安装.
在Windows上安装 从http://msysgit.github.io/下载。 在bash下输入以下命令,设置账号和邮箱。是全局的,在之后的所有git操作,都是以这个账号.
1 2 $ git config --global user.name "Your Name" $ git config --global user.email "email@example.com" ** 注意:** git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
1 $ git config --global --list查看当前的所有设置清单列表。 创建版本库(repository) 如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。 一共三步:初始化,添加文件,提交
1 2 3 4 5 $ git init $ git add readme.txt $ git commit -m "提交的信息" 查看仓库的修改状态 1 2 3 4 $ git status 这个命令会告诉我们修改了哪些文件,在知道了修改的文件之后,通过 $ git diff readme.
序 本篇分析大头鬼的 JsBridge 库.
js bridge 分析大头鬼的 JS 库 主要的任务都交给了 JS 库去执行,整个框架的主要过程分为三个过程,native 通过发送消息调用 JS 方法,在 JS 层的消息处理,将消息处理完成之后返回。
Java调用JS 方法 对于 native 想要调用 JS 代码的时候,会调用自定义的 BridgeWebView 的 send 方法进行发送消息,对于消息,我们可以自定义处理器和回调处理方法,发出去的消息不是立即处理的,而是将其进行封装,成 Message 对象,如果该消息后续有回调,需要记录回调等待后续的处理,而后添加到队列中。进行排队,等待处理。
Java 消息的分发 这个消息的分发是指的 native 层面的消息分发,当页面加载 finish 之后,会调用 dispatch 方法对刚刚进入队列中的 Message 对象进行分发。解析出 Message 携带的内容,按照约定,生成对应的 JS 脚本,交由 JS 库处理。
加载 JS 库 按照流程的事件顺序上讲,这个过程应该是第一个被执行的,在加载完 HTML 页面的同时需要加载 JS 库,但是 JS 库的加载和页面的加载谁先成功,这个可能出现先后差异,所以需要在 HTML 中判断 JS 库是否加载成功,如果加载成功则进行消息处理;如果加载还未成功,则监听加载 JS 库的事件,等到加载成功之后,再进行消息的处理。这些事件的处理需要在 HTML 中处理.
JS 库对消息的处理 这里处理的其实是一个 URL ,在 JS 库层面会调用相应的 JS 方法。当 Java 层调用了消息的分发命令,会通过执行 JS 脚本的方式将消息交给 JS 层,JS 层面会将需要处理的消息,添加到队列中,等待处理,这个过程又有点像 Java 层的处理方式,_handleMessageFromNative ,会将消息存入 receiveMessageQueue 中,等待处理。
概述 本文记录学习 Linux 的记录.
命令 软件安装 deb 文件安装 直接双击,安装,ubuntu 上会自动调用软件管理器安装.
zip文件安装 这种是包含了源码的,通过命令解压,设置环境变量.
1 zip zipFileName.zip tar.gz 源代码安装 在终端中进行解压操作;
1 2 tar -zxvf ****.tar.gz tar -jxvf ****.tar.bz(或bz2) 看是否需要设置环境变量,亦或是有.sh启动文件.
设置环境变量的方法 有三种环境变量的设置方法,一种是临时性的,只在本次的命令行中有效,一种是针对当前用户的,还有一种就是全局性的,针对所有用的.
rpm 文件安装 卸载 apt-get autoclean: 如果你的硬盘空间不大的话,可以定期运行这个程序,将已经删除了的软件包的.deb安装文件从硬盘中删除掉。如果你仍然需要硬盘空间的话,可以试试apt-get clean,这会把你已安装的软件包的安装包也删除掉,当然多数情况下这些包没什么用了,因此这是个为硬盘腾地方的好办法。
apt-get clean: 类似上面的命令,但它删除包缓存中的所有包。这是个很好的做法,因为多数情况下这些包没有用了。但如果你是拨号上网的话,就得重新考虑了。
apt-get autoremove: 删除为了满足其他软件包的依赖而安装的,但现在不再需要的软件包。
其它:
apt-get remove 软件包名称: 删除已安装的软件包(保留配置文件)。 apt-get –purge remove 软件包名称: 删除已安装包(不保留配置文件)。