Skip to content
195 changes: 149 additions & 46 deletions README.md

Large diffs are not rendered by default.

Large diffs are not rendered by default.

80 changes: 80 additions & 0 deletions android/Android5.0、6.0、7.0新特性.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
Android 7.0

分屏多任务支持

画中画

通知栏快速回复

OpenJDK替换Java API

Android 7.0中采用了一项具有实时代码剖析功能的ARI JIT编译器,它能够在安卓应用程序在运行时不断提高自身的性能

[art虚拟机介绍](http://www.cnblogs.com/manuosex/p/3634375.html)
http://www.cnblogs.com/manuosex/p/3634375.html






--------------------------------------------------------------------------------
Android6.0

1、大量漂亮流畅的动画
安卓6.0系统增加了大量漂亮的过度动画,可以从视觉上减少卡顿感,给用户带来流畅的体验。

2、相机新增专业模式
一直以来,原生的安卓相机都长被吐槽太过简单甚至简陋了,在此次的安卓6.0中,相机中新增了Pro专业模式,增加了快门速度调节和曝光度调节等新功能。

3、全新的电源键菜单
一般来说,安卓的电源键菜单都是关机/重启/飞行,安卓6.0变成了关机/重启/紧急,关机和重启就不用赘述了,这个紧急模式是为了手机快没电的时候设计的,相当于飞行模式的高级版,可以关闭一切耗电应用,尽最大可能节省电量。

4、可自定义锁界面样式
支持电话、信息、相机等快捷方式在锁屏界面的定制,用户可以根据自己的喜好调整这些图标的位置,或者开启或关闭这些快捷方式。

5、全新的快速设置风格
不但是锁屏界面可以定制,安卓6.0还采用了全新的快速面板的色彩方案,用户可以通过更换主题换颜色。

6、支持快速充电的切换
快速充电是手机厂商们的一大新发明,很多厂商都声称“充电X分钟,通话两小时”,这个功能虽然方便,但其实也有弊端,容易造成手机和电池发热。所以除非是在紧急情况下,一般不建议快速充电,安卓6.0原生支持关闭和开启快速充电功能。

7、支持文件夹拖拽应用
可在应用从一个文件夹内直接拖到另一个文件夹,简化了此前繁琐的操作方式,拖拽的过程和Windows的拖拽功能有点相似。

8、原生的应用权限管理
无需第三方应用和Root权限,原生的安卓6.0就支持应用权限管理,用户可以在安装应用时选择关闭一些应用权限,这一功能非常方便,再也不用担心流量偷跑和扣费了。

9、Now on Tap功能
“Now on Tap ”功能,是指将Google Now(一种语音助手)作为底层植入到安卓6.0系统中,用户只要只要双击home键启动Google Now,“这意味着用户随时都能启动搜索功能,目前暂时不知道这个功能进入国内会不会阉割掉。

10、支持RAW格式照片
RAW格式的支持是众多拍照爱好者梦寐以求的, 然而绝大多数的安卓手机都没有或者剔除了这项功能。由于照片保存为jpg格式时或多或少都会损失一些画质,所以支持RAW格式是非常明智的。


--------------------------------------------------------------------------------
Android5.0

- 全新 Material Design 设计风格

- 支持多种设备(手机、平板电脑、笔记本电脑、智能电视、汽车、智能手表甚至是各种家用电子产品)

- 全新的通知中心设计(在锁屏界面也可以直接查看通知消息了,用户还可以直接在锁屏的情况下就行回复或进入应用。)

- 支持 64 位 ART 虚拟机

>   新系统不仅在视觉效果上带来了巨大的变化,Android Lollipop 还在内部的性能上进行了飞跃。首先,新系统放弃了之前一直使用的 Dalvik 虚拟机,改用了 ART 模式,实现了真正的跨平台编译,在 ARM、X86、MIPS 等,无处不在。
  ART 虚拟机编译器在内存占用及应用程序加载时间上进行了大幅提升,谷歌承诺所有性能都会比原来提升一倍。另外,对 64 位的支持也让 ART 虚拟机如鱼得水,开发者可以针对像 ARM Cortex-A57 这样的 64 位架构核心开发应用程序。Android Lollipop 支持更大的寄存器,支持新的指令集,提升了内存寻址空间,未来 Android 智能手机将支持 4GB 以上的内存。

- Project Volta 电池续航改进计划

增加了 Battery Saver 模式,在低电量的时候系统会自动降低屏幕亮度、限制自动更换背景等功能。

- 全新的“最近应用程序”

除了界面风格设计的改变之外,新的最近应用界面还借鉴了 Chrome 浏览器的理念,采用单独的标签展示方式。更重要的是,谷歌已经向开发者开放了 API,所以第三方开发人员可以利用这个改进为特定的应用增加全新的功能。

- 新的 API 支持,蓝牙 4.1、USB Audio、多人分享等其它特性



8 changes: 8 additions & 0 deletions android/Android中弱引用与软引用的应用场景.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
  在Android应用的开发中,为了防止内存溢出,在处理一些占用内存大而且声明周期较长的对象时候,可以尽量应用软引用和弱引用技术。
下面以使用软引用为例来详细说明。弱引用的使用方式与软引用是类似的。

  假设我们的应用会用到大量的默认图片,比如应用中有默认的头像,默认游戏图标等等,这些图片很多地方会用到。如果每次都去读取图片,由于读取文件需要硬件操作,速度较慢,会导致性能较低。所以我们考虑将图片缓存起来,需要的时候直接从内存中读取。但是,由于图片占用内存空间比较大,缓存很多图片需要很多的内存,就可能比较容易发生OutOfMemory异常。这时,我们可以考虑使用软引用技术来避免这个问题发生。

   使用软引用以后,在OutOfMemory异常发生之前,这些缓存的图片资源的内存空间可以被释放掉的,从而避免内存达到上限,避免Crash发生。

  需要注意的是,在垃圾回收器对这个Java对象回收前,SoftReference类所提供的get方法会返回Java对象的强引用,一旦垃圾线程回收该Java对象之后,get方法将返回null。所以在获取软引用对象的代码中,一定要判断是否为null,以免出现NullPointerException异常导致应用崩溃。
90 changes: 90 additions & 0 deletions android/Android长连接,怎么处理心跳机制.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
> 心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制。

android系统的推送和iOS的推送有什么区别:

   首先我们必须知道,所有的推送功能必须有一个客户端和服务器的长连接,因为推送是由服务器主动向客户端发送消息,如果客户端和服务器之间不存在一个长连接那么服务器是无法来主动连接客户端的。因而推送功能都是基于长连接的基础是上的。

  IOS长连接是由系统来维护的,也就是说苹果的IOS系统在系统级别维护了一个客户端和苹果服务器的长链接,IOS上的所有应用上的推送都是先将消息推送到苹果的服务器然后将苹果服务器通过这个系统级别的长链接推送到手机终端上,这样的的几个好处为:

1.在手机终端始终只要维护一个长连接即可,而且由于这个长链接是系统级别的不会出现被杀死而无法推送的情况。  

2.省电,不会出现每个应用都各自维护一个自己的长连接。 

3.安全,只有在苹果注册的开发者才能够进行推送,等等。 

 android的长连接是由每个应用各自维护的,但是google也推出了和苹果技术架构相似的推送框架,C2DM,云端推送功能,但是由于google的服务器不在中国境内,其他的原因你懂的。所以导致这个推送无法使用,android的开发者不得不自己去维护一个长链接,于是每个应用如果都24小时在线,那么都得各自维护一个长连接,这种电量和流量的消耗是可想而知的。虽然国内也出现了各种推送平台,但是都无法达到只维护一个长连接这种消耗的级别。 

推送的实现方式:
一:客户端不断的查询服务器,检索新内容,也就是所谓的pull 或者轮询方式 

二:客户端和服务器之间维持一个TCP/IP长连接,服务器向客户端push 

三:服务器有新内容时,发送一条类似短信的信令给客户端,客户端收到后从服务器中下载新内容,也就是SMS的推送方式 

  苹果的推送系统和googleC2DM推送系统其实都是在系统级别维护一个TCP/IP长连接,都是基于第二种的方式进行推送的。第三种方式由于运营商没有免费开放这种信令导致了这种推送在成本上是无法接受的,虽然这种推送的方式非常的稳定,高效和及时。
如果想了解android中各种推送方式请参考这个链接:Android实现推送方式解决方案 这篇博客已经介绍的非常好了。

   所谓的心跳包就是客户端定时放送简单的信息给服务器端,告诉它我还在而已。代码就是每隔几分钟发送一个固定信息给服务器端,服务器端回复一个固定信息。如果服务器端几分钟后没有收到客户端信息则视客户端断开。比如有些通信软件长时间不适用,要想知道它的状态是在线还是离线,就需要心跳包,定时发包收包。 

 心跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活在。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一个空包。
在TCP机制里面,本身是存在有心跳包机制的,也就是TCP选项:SO_KEEPALIVE. 系统默认是设置的2小时的心跳频率。

  心跳包的机制,其实就是传统的长连接。或许有的人知道消息推送的机制,消息推送也是一种长连接 ,是将数据有服务器端推送到客户端这边从而改变传统的“拉”的请求方式。下面我来介绍一下安卓和客户端两个数据请求的方式
1、push 这个也就是有服务器推送到客户端这边 现在有第三方技术 比如极光推送。
2、pull 这种方式就是客户端向服务器发送请求数据(http请求)

实现轮询 

● 原理  

  其原理在于在android端的程序中,让一个SERVICE一直跑在后台,在规定时间之内调用服务器接口进行数据获取。这里的原理很简单,当然实现起来也不难;然后,这个类之中肯定要做网络了数据请求,所以我们在Service中建立一个线程(因为在android系统中网络请求属于长时间操作,不能放主线程,不然会导致异常),在线程中和服务器进行通信。

  最后,这个逻辑写完后,我们需要考虑一个问题,如何进行在规定时间内调用该服务器,当然可以用Thread+Handler(这个不是那么稳定),也可以使用AlamManager+Thread(比较稳定),因为我们需要其在后台一直运行,所以可以依靠系统的Alammanager这个类来实现,Alammanager是属于系统的一个闹钟提醒类,通过它我们能实现在规定间隔时间调用,并且也比较稳定,这个service被杀后会自己自动启动服务。



> 心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制。

android系统的推送和iOS的推送有什么区别:

   首先我们必须知道,所有的推送功能必须有一个客户端和服务器的长连接,因为推送是由服务器主动向客户端发送消息,如果客户端和服务器之间不存在一个长连接那么服务器是无法来主动连接客户端的。因而推送功能都是基于长连接的基础是上的。

  IOS长连接是由系统来维护的,也就是说苹果的IOS系统在系统级别维护了一个客户端和苹果服务器的长链接,IOS上的所有应用上的推送都是先将消息推送到苹果的服务器然后将苹果服务器通过这个系统级别的长链接推送到手机终端上,这样的的几个好处为:

1.在手机终端始终只要维护一个长连接即可,而且由于这个长链接是系统级别的不会出现被杀死而无法推送的情况。  

2.省电,不会出现每个应用都各自维护一个自己的长连接。 

3.安全,只有在苹果注册的开发者才能够进行推送,等等。 

 android的长连接是由每个应用各自维护的,但是google也推出了和苹果技术架构相似的推送框架,C2DM,云端推送功能,但是由于google的服务器不在中国境内,其他的原因你懂的。所以导致这个推送无法使用,android的开发者不得不自己去维护一个长链接,于是每个应用如果都24小时在线,那么都得各自维护一个长连接,这种电量和流量的消耗是可想而知的。虽然国内也出现了各种推送平台,但是都无法达到只维护一个长连接这种消耗的级别。 

推送的实现方式:
一:客户端不断的查询服务器,检索新内容,也就是所谓的pull 或者轮询方式 

二:客户端和服务器之间维持一个TCP/IP长连接,服务器向客户端push 

三:服务器有新内容时,发送一条类似短信的信令给客户端,客户端收到后从服务器中下载新内容,也就是SMS的推送方式 

  苹果的推送系统和googleC2DM推送系统其实都是在系统级别维护一个TCP/IP长连接,都是基于第二种的方式进行推送的。第三种方式由于运营商没有免费开放这种信令导致了这种推送在成本上是无法接受的,虽然这种推送的方式非常的稳定,高效和及时。
如果想了解android中各种推送方式请参考这个链接:Android实现推送方式解决方案 这篇博客已经介绍的非常好了。

   所谓的心跳包就是客户端定时放送简单的信息给服务器端,告诉它我还在而已。代码就是每隔几分钟发送一个固定信息给服务器端,服务器端回复一个固定信息。如果服务器端几分钟后没有收到客户端信息则视客户端断开。比如有些通信软件长时间不适用,要想知道它的状态是在线还是离线,就需要心跳包,定时发包收包。 

 心跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活在。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一个空包。
在TCP机制里面,本身是存在有心跳包机制的,也就是TCP选项:SO_KEEPALIVE. 系统默认是设置的2小时的心跳频率。

  心跳包的机制,其实就是传统的长连接。或许有的人知道消息推送的机制,消息推送也是一种长连接 ,是将数据有服务器端推送到客户端这边从而改变传统的“拉”的请求方式。下面我来介绍一下安卓和客户端两个数据请求的方式
1、push 这个也就是有服务器推送到客户端这边 现在有第三方技术 比如极光推送。
2、pull 这种方式就是客户端向服务器发送请求数据(http请求)

实现轮询 

● 原理  

  其原理在于在android端的程序中,让一个SERVICE一直跑在后台,在规定时间之内调用服务器接口进行数据获取。这里的原理很简单,当然实现起来也不难;然后,这个类之中肯定要做网络了数据请求,所以我们在Service中建立一个线程(因为在android系统中网络请求属于长时间操作,不能放主线程,不然会导致异常),在线程中和服务器进行通信。

  最后,这个逻辑写完后,我们需要考虑一个问题,如何进行在规定时间内调用该服务器,当然可以用Thread+Handler(这个不是那么稳定),也可以使用AlamManager+Thread(比较稳定),因为我们需要其在后台一直运行,所以可以依靠系统的Alammanager这个类来实现,Alammanager是属于系统的一个闹钟提醒类,通过它我们能实现在规定间隔时间调用,并且也比较稳定,这个service被杀后会自己自动启动服务。



47 changes: 47 additions & 0 deletions android/Asset目录与res目录的区别.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
- res/raw和assets的相同点: 

  两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。

- res/raw和assets的不同点:

  res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。 

  res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹 

读取文件资源: 

  读取res/raw下的文件资源,通过以下方式获取输入流来进行写操作

```
InputStream is =getResources().openRawResource(R.id.filename);
```

  读取assets下的文件资源,通过以下方式获取输入流来进行写操作


```
/**
* 从assets中读取图片
*/
private Bitmap getImageFromAssetsFile(String fileName)
{
Bitmap image = null;
AssetManager am = getResources().getAssets();
try
{
InputStream is = am.open(fileName);
image = BitmapFactory.decodeStream(is);
is.close();
}
catch (IOException e)
{
e.printStackTrace();
}
return image;
}
```

注意1:Google的Android系统处理Assert有个bug,在AssertManager中不能处理单个超过1MB的文件,不然会报异常,raw没这个限制可以放个4MB的Mp3文件没问题。 

注意2:assets 文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像 xml, java 文件被预编译,可以存放一些图片,html,js, css 等文件。

10 changes: 10 additions & 0 deletions android/Binder机制原理和底层实现.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@

[Binder机制1---Binder原理介绍](http://www.jcodecraeer.com/plus/view.php?aid=2619) 

[Binder机制2---Binder的数据结构以及Binder驱动](http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0319/2620.html)

[Binder机制3---Native层](http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0319/2621.html)

[Binder机制4---Framework层](http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0319/2622.html)

[Binder机制5--- Binder实现进程管理服务示例](http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0319/2623.html)
Loading