笔沫

有梦为马,随处可栖

  • 主页
  • 技术
  • 随想
  • 音乐
所有文章 其他

笔沫

有梦为马,随处可栖

  • 主页
  • 技术
  • 随想
  • 音乐

Binder通信机制原理解析

2017-12-14

Binder是什么?Binder有啥用?作为一个应用开发者,如果我们开发的应用不涉及跨进程通信(IPC),我想我们也不会去接触Binder。但不知你有没有发现,近来的Andorid面试,都会问及Android跨进程通信方面的知识,这又是为什么呢?如果你喜欢看Android源码,你就会发现Binder无处不在,Android系统中很多服务都是通过Binder来进行跨进程通信,了解Binder,弄懂Binder原理,这就变得非常重要了。

Android的内核是Linux内核,但为什么没有采用Linux常用的跨进程通信方式呢?而是采用Binder呢?这里在知乎有一篇非常详细的帖子:为什么 Android 要采用 Binder 作为 IPC 机制?大家可以看一下,我相信此篇帖子下肚,你就可以了解当年Android之父Andy Rubin为什么会选择Binder作为android系统跨进程通信方式了。

一、什么Binder?

Binder是Android系统中非常重要的一种跨进程通信方式(IPC)。

Binder是一种基于C/S的架构,主要包含四个部分:服务端(Server),客户端(Client),Binder驱动,ServiceManager。

Android四大组件Activity、Service、BroadcastReceiver和ContentProvider的启动原理也都与Binder IPC机制有关;Android源码中ActivityManagerService、PackageManagerService、WindowManagerService、PowerManagerService等服务的调用也都与Binder IPC机制有关。

二、Binder跨进程通信实现原理

1.应用进程空间分配
more >>

  • 技术
  • Android
  • Android框架源码解析
  • Binder通信机制

展开全文 >>

设计模式-六大原则

2017-12-13

当初作为小白,提到设计模式,就会觉得很高大上,很牛叉。其实,在我们身边,在我们的项目中,设计模式的身影无处不在。然而,什么是设计模式呢?百度解释为:设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。 经验总是值得学习的,特别是对我们编程有极大帮助的设计模式经验。在Java中常见的设计模式有23种,而这23种设计模式都遵循了设计模式的六大原则,这六大原则分别是:

  • 单一职责原则
  • 里氏替换原则
  • 依赖倒转原则
  • 接口隔离原则
  • 迪米特法则
  • 开放封闭原则

一、单一职责原则

1.定义:不要存在多于一个导致类变更的原因。

2.通俗的说:一个类只负责一项职责。

3.优点

  • 可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;
  • 提高类的可读性,提高系统的可维护性;
  • 变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。
more >>
  • 技术
  • 设计模式

展开全文 >>

Logger框架源码解析

2017-11-30

在移动软件开发中,我们经常会用到很多框架,如网络框架retrofit,图片加载框架glide,数据库框架litepal,日志框架Logger等。这些框架对应用都很重要,日志框架也是其中重要的一部分。因为很多操作如调试,优化,修改bug等都需要通过日志来验证我们的想法,所以日志框架就成项目的必需。本篇博文将会介绍Logger日志框架,主要从源码的角度分析。

一、什么是Logger框架?

Simple, pretty and powerful logger for android。简单,功能强大日志框架,专为Android。

Logger有多强大呢?先让我们来看一张打印日志图:


more >>

  • 技术
  • Android
  • 开源框架源码解析
  • Logger框架源码解析

展开全文 >>

Android应用程序入口源码解析

2017-11-23

我们在写C、C++或java应用时,都会有一个main函数,但Android的main函数在哪里呢?偶记得从第一个HelloWorld应用开始,就知道,只要在AndroidManifest配置表中对Activity的intent-filter进行配置,action为android.intent.action.MAIN,category为android.intent.category.LAUNCHER,应用程序启动的时候就会首先启动这个Activity,此Activity也就是应用的入口;后来又知道Application这个类,只要有类继承Application,并在AndroidManifest配置表中对application的name进行配置该类,android应用启动后会把该类的attachBaseContext和onCreate方法作为程序开发入口。实际上是不是这样的呢?本篇博文将会从源码角度来分析。

在说Android应用程序开发入口之前,我们有必要了解一下android系统的启动和Android应用程序的启动流程,这样有助于我们对Android系统有一个整体的认识。首先,让我们来简单了解一下Android系统的启动流程。

一、Android系统的启动

Android系统的启动流程是怎样的呢?首先先来看一下流程图:


more >>

  • 技术
  • Android
  • Android框架源码解析
  • Android应用程序入口源码解析

展开全文 >>

Android消息机制源码解析(Handler)

2017-11-21

Android消息机制,其实也就是Handler机制,主要用于UI线程和子线程之间交互。众所周知,一般情况下,出于安全的考虑,所有与UI控件的操作都要放在主线程即UI线程中,而一些耗时操作应当放在子线程中。当在子线程中完成耗时操作并要对UI控件进行操作时,就要用Handler来控制。另外,Android系统框架内,Activity生命周期的通知等功能也是通过消息机制来实现的。本篇博文主要是想通过Handler源码解析,来加深我自己对Android消息机制的理解。

一、Handler使用

使用例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private Handler handler = new Handler(){//1.Handler初始化,一个匿名内部类
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
textView.setText("对UI进行操作");
}
};
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.mytv);
new Thread(new Runnable() {
@Override
public void run() {
//模拟耗时操作
SystemClock.sleep(3000);
handler.sendMessage(new Message());//2.在子线程中sendMessage();
}
}).start();
}

1.我们先来看看,Handler初始化。
Handler初始化的同时,实现了消息处理方法handleMessage()。查看Handler源码
more >>

  • 技术
  • Android
  • Android框架源码解析
  • Android消息机制源码解析

展开全文 >>

Butter Knife框架源码解析

2017-11-17

最初的开始,findViewById()获取View控件,setOnClickListener设置View的监听事件,然后UI界面开始有响应。当初完成这个操作,有点兴奋,而这也成为我Android开发的起点。随着时间的推移,android也越来越熟悉,findViewById和setOnClickListener不知写了多少遍,偶发现有好大一部分时间,就是在写findViewById获取变量。针对这问题,在网络上发现了Jake Wharton大神的Butterknife开源框架,后用之,节约了很多时间。本篇博文将会对Butterknife源码进行解析。

一、什么是Butterknife?

Butterknife,是专门为Android View设计的绑定注解框架,专业解放各种findViewById和setOnClickListener。

Butterknife地址:https://github.com/JakeWharton/butterknife

二、Butterknife源码解析

1.Butterknife绑定分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class FeedbackActivity extends Activity{
@BindView(R.id.mContentEdit)
EditText mContentEdit;
@BindView(R.id.mSubmitBtn)//1.View注解
TextView mSubmitBtn;
@BindView(R.id.mContentCountTv)
TextView mContentCountTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_feedback);
ButterKnife.bind(this);//3.与Activity绑定
}
@OnClick(R.id.mSubmitBtn)//2.View监听事件注解
public void onClick() {
}
}

more >>
  • 技术
  • Android
  • 开源框架源码解析
  • Butterknife框架源码解析

展开全文 >>

LeakCanary框架源码解析

2017-11-16

如果我们开发的程序,出现内存泄漏,导致程序奔溃,造成用户卸载APP。这样的结果,是我们不想见到的。作为一名向上的程序员,如何避免内存泄漏,这就成为必须要解决的问题。良心企业Square,开源了LeakCanary框架,可以轻松集成,让检测内存泄漏变得十分容易。

什么是内存泄漏?
内存泄漏是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

一、什么是LeakCanary?

LeakCanary 是一个检测内存泄露的开源类库。你可以在 debug 包种轻松检测内存泄露。

LeakCanary源码地址:https://github.com/square/leakcanary

二、LeakCanary源码解析

1.LeakCanary入口

1
2
3
4
5
6
7
8
public class ExampleApplication extends Application {
@Override public void onCreate() {
super.onCreate();
LeakCanary.install(this);//1.核心方法
}
}
more >>
  • 技术
  • Android
  • 开源框架源码解析
  • LeakCanary框架源码分析

展开全文 >>

Android Fragment使用小结及介绍

2017-11-10

偶记得第一次接触Fragment,觉得好牛叉的组件,可以做许多Activity可以做的事,辅助Activity让功能可以做得更加强大;一次编写,可以多个地方可以使用,解放了Activity。在这里,本篇文章主要是总结fragment的两种添加方式,add和replace。

一、什么是Fragment

简单来说,Fragment其实可以理解为一个具有自己生命周期的控件,只不过这个控件又有点特殊,它有自己的处理输入事件的能力,有自己的生命周期,又必须依赖于Activity,能互相通信和托管。

使用Fragment还有这么几个方面优势:

  • 代码复用。特别适用于模块化的开发,因为一个Fragment可以被多个Activity嵌套,有个共同的业务模块就可以复用了,是模块化UI的良好组件。
  • Activity用来管理Fragment。Fragment的生命周期是寄托到Activity中,Fragment可以被Attach添加和Detach释放。
  • 可控性。Fragment可以像普通对象那样自由的创建和控制,传递参数更加容易和方便,也不用处理系统相关的事情,显示方式、替换、不管是整体还是部分,都可以做到相应的更改。
  • Fragments是view controllers,它们包含可测试的,解耦的业务逻辑块,由于Fragments是构建在views之上的,而views很容易实现动画效果,因此Fragments在屏幕切换时具有更好的控制。

二、Fragment的生命周期

Fragment的生命周期类似Activity,如下图,Activity生命周期与Fragment生命周期对比图:
more >>

  • 技术
  • Android
  • Fragment

展开全文 >>

Android悬浮窗原理解析

2017-10-17

悬浮窗,在大多数应用中还是很少见的,目前我们接触到的悬浮窗,差不多都是一些系统级的应用软件,例如:360安全卫士,腾讯手机管家等;在某些服务行业如金融,餐饮等,也会在应用中添加悬浮窗,例如:美团的偷红包,博闻金融快捷联系等。但两种悬浮窗还是有区别的:

  • 系统悬浮窗:所有界面都会展示,包括主屏、锁屏
  • 应用悬浮窗:只在应用Activity中展示。

一、窗口Window

在了解悬浮窗之前,首先我们需要认识一下Android窗口Window。Android Framework将窗口分为三个类型:

  1. 应用窗口:所谓应用窗口指的就是该窗口对应一个Activity,因此,要创建应用窗口就必须在Activity中完成了。
  2. 子窗口:所谓子窗口指的是必须依附在某个父窗口之上,比如PopWindow,Dialog。
  3. 系统窗口:所谓系统窗口指的是由系统进程创建,不依赖于任何应用或者不依附在任何父窗口之上,如:Toast,来电窗口等。

Framework定义了三种窗口类型,这三种类型定义在WindowManager的内部类LayoutParams中,WindowManager将这三种类型 进行了细化,把每一种类型都用一个int常量来表示,这些常量代表窗口所在的层,WindowManagerService在进行窗口叠加的时候,会按照常量的大小分配不同的层,常量值越大,代表位置越靠上面,所以我们可以猜想一下,应用程序Window的层值常量要小于子Window的层值常量,子Window的层值常量要小于系统Window的层值常量。Window的层级关系如下所示。


more >>

  • 技术
  • Android
  • 悬浮窗
  • WindowManager

展开全文 >>

你本是一个肉体,是什么驱使你前行[4]

2017-10-16

文/丹尼尔

生活最大的危险,就是空虚的心灵。

罗曼 • 罗兰说:「生活最沉重的负担不是工作,而是无聊。」每个人要对自己的生活负责。一个人至少拥有一个梦想,才能让自己有动力和激情去坚持。生活的理想,就是为了理想的生活。追求不同的生活方式,是对人生做加法。追求更好的生活品质,则是对人生做减法。

不知道你是在做人生加法,还是人生减法?年轻的时候,绝大部分人会有很多想法,什么都想要,什么都想尝试。人到中年时,才会发现人的精力极其有限,一生中只要做好一两件事情,并且做漂亮了,就足以。当一个人抵达生活的极限后,就会删繁就简,让生命变得更加纯粹,更有效率地追求人生中最让自己感到愉悦的事。

好的生活,不是贵价格,而是贵品质;不是贵物质,而是贵精神。生活不是越复杂越好,而是越简约越好。化繁为简,便是一种高品质的生活方式。最完美的生活品质,往往讲究一个人长期健康稳定的发展,至少是以下三位一体的生活方式:拥有思想的读书生活,开阔见识的旅行生活,健康身体的运动生活。
more >>

  • 技术
  • 随想
  • 你本是一个肉体,是什么驱使你前行

展开全文 >>

« Prev12345Next »
© 2019 笔沫
Hexo Theme Yilia by Litten
  • 所有文章
  • 其他

tag:

  • 技术
  • Android
  • Activity的启动模式
  • Android注解
  • Java反射机制
  • Java动态代理
  • Android基础
  • MVP
  • NDK
  • JNI C/C++
  • 开源框架
  • AS Gradle优化
  • 博客搭建
  • 设计模式
  • Fragment
  • Rxjava
  • Rxandroid
  • 响应式编程
  • 随想
  • 你本是一个肉体,是什么驱使你前行
  • 原创
  • 笔沫拾光
  • Java
  • Java基础
  • 王阳明心学
  • 中国历史
  • 人生的意义
  • 演讲
  • 执着的人是幸福的
  • 郭川
  • Android框架源码解析
  • 加解密算法
  • Binder通信机制
  • 开源框架源码解析
  • LeakCanary框架源码分析
  • Java集合类
  • 转载
  • Http文件断点续传
  • Logger框架源码解析
  • Android应用程序入口源码解析
  • DecorView绘制流程
  • Android消息机制源码解析
  • Activity启动流程
  • Butterknife框架源码解析
  • 我之存在,因为有你
  • 霍华德*舒尔茨
  • Android相机
  • Camera
  • 悬浮窗
  • WindowManager

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 风光摄影
  • 星空摄影
  • 人像摄影
  • 学习站点