From 90960855fc72bfc00b3e26aa347da7d5f3dd488b Mon Sep 17 00:00:00 2001 From: fanrunqi Date: Wed, 22 Jun 2016 17:43:26 +0800 Subject: [PATCH 01/17] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e7695fe..ddcc4a6 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Android 名企面试题及涉及知识点整理。 ### (我会持续更新,欢迎watch) - +### 同类仓库推荐:[LearningNotes](https://github.com/GeniusVJR/LearningNotes) ## [Android](https://github.com/fanrunqi/ForAndroidInterview/tree/master/android) From a823d38c38153a8829d3e3d66440b10eb53e80c3 Mon Sep 17 00:00:00 2001 From: fanrunqi Date: Wed, 22 Jun 2016 17:54:41 +0800 Subject: [PATCH 02/17] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ddcc4a6..3290d63 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -# Android 名企面试题及涉及知识点整理。 -### (我会持续更新,欢迎watch) -### 同类仓库推荐:[LearningNotes](https://github.com/GeniusVJR/LearningNotes) +## Android 名企面试题及涉及知识点整理。 +#### (我会持续更新,欢迎watch) +#### 同类仓库推荐:[LearningNotes](https://github.com/GeniusVJR/LearningNotes) ## [Android](https://github.com/fanrunqi/ForAndroidInterview/tree/master/android) From 0367dcb99219a8977c23c660d16e274585f9af3f Mon Sep 17 00:00:00 2001 From: fanrunqi Date: Wed, 22 Jun 2016 19:00:37 +0800 Subject: [PATCH 03/17] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3290d63..e9b96eb 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ * [AIDL的使用情况和实例介绍](https://github.com/fanrunqi/ForAndroidInterview/blob/master/android/AIDL%E7%9A%84%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5%E5%92%8C%E5%AE%9E%E4%BE%8B%E4%BB%8B%E7%BB%8D.md) -* [[Android] 名企面试题及答案整理(一)](https://github.com/fanrunqi/ForAndroidInterview/blob/master/android/%5BAndroid%5D%20%E5%90%8D%E4%BC%81%E9%9D%A2%E8%AF%95%E9%A2%98%EF%BC%88%E4%B8%80%EF%BC%89.md) +* [Android 名企面试题及答案整理(一)](https://github.com/fanrunqi/ForAndroidInterview/blob/master/android/%5BAndroid%5D%20%E5%90%8D%E4%BC%81%E9%9D%A2%E8%AF%95%E9%A2%98%EF%BC%88%E4%B8%80%EF%BC%89.md) ## [Java](https://github.com/fanrunqi/ForAndroidInterview/tree/master/java) From 2fe34b266ae6d8fca16fc06123d25a6aa49fa04d Mon Sep 17 00:00:00 2001 From: fanrunqi Date: Wed, 22 Jun 2016 19:02:22 +0800 Subject: [PATCH 04/17] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index e9b96eb..1ebce36 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ ## Android 名企面试题及涉及知识点整理。 #### (我会持续更新,欢迎watch) -#### 同类仓库推荐:[LearningNotes](https://github.com/GeniusVJR/LearningNotes) ## [Android](https://github.com/fanrunqi/ForAndroidInterview/tree/master/android) From acf1da3d3a8046afe9f19402d5b8c3369c032e1e Mon Sep 17 00:00:00 2001 From: fanrunqi Date: Thu, 23 Jun 2016 09:42:09 +0800 Subject: [PATCH 05/17] Update README.md --- README.md | 86 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 44 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index 1ebce36..e42b24a 100644 --- a/README.md +++ b/README.md @@ -41,84 +41,84 @@ ## [Java](https://github.com/fanrunqi/ForAndroidInterview/tree/master/java) -* [[Java] ArrayList、LinkedList、Vector的区别](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20ArrayList%E3%80%81LinkedList%E3%80%81Vector%E7%9A%84%E5%8C%BA%E5%88%AB.md) +* [ArrayList、LinkedList、Vector的区别](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20ArrayList%E3%80%81LinkedList%E3%80%81Vector%E7%9A%84%E5%8C%BA%E5%88%AB.md) -* [[Java] Collection包结构,与Collections的区别](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20Collection%E5%8C%85%E7%BB%93%E6%9E%84%EF%BC%8C%E4%B8%8ECollections%E7%9A%84%E5%8C%BA%E5%88%AB.md) +* [Collection包结构,与Collections的区别](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20Collection%E5%8C%85%E7%BB%93%E6%9E%84%EF%BC%8C%E4%B8%8ECollections%E7%9A%84%E5%8C%BA%E5%88%AB.md) -* [[Java] Excption与Error包结构,OOM和SOF](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20Excption%E4%B8%8EError%E5%8C%85%E7%BB%93%E6%9E%84%2COOM%E5%92%8CSOF.md) +* [Excption与Error包结构,OOM和SOF](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20Excption%E4%B8%8EError%E5%8C%85%E7%BB%93%E6%9E%84%2COOM%E5%92%8CSOF.md) -* [[Java] HashMap和HashTable的区别](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20HashMap%E5%92%8CHashTable%E7%9A%84%E5%8C%BA%E5%88%AB.md) +* [HashMap和HashTable的区别](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20HashMap%E5%92%8CHashTable%E7%9A%84%E5%8C%BA%E5%88%AB.md) -* [[Java] HashMap源码分析](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20HashMap%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90.md) +* [HashMap源码分析](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20HashMap%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90.md) -* [[Java] Hashcode的作用](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20Hashcode%E7%9A%84%E4%BD%9C%E7%94%A8.md) +* [Hashcode的作用](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20Hashcode%E7%9A%84%E4%BD%9C%E7%94%A8.md) -* [[Java] Map、Set、List、Queue、Stack的特点与用法](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20Map%E3%80%81Set%E3%80%81List%E3%80%81Queue%E3%80%81Stack%E7%9A%84%E7%89%B9%E7%82%B9%E4%B8%8E%E7%94%A8%E6%B3%95.md) +* [Map、Set、List、Queue、Stack的特点与用法](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20Map%E3%80%81Set%E3%80%81List%E3%80%81Queue%E3%80%81Stack%E7%9A%84%E7%89%B9%E7%82%B9%E4%B8%8E%E7%94%A8%E6%B3%95.md) -* [[Java] Object有哪些公用方法?](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20Object%E6%9C%89%E5%93%AA%E4%BA%9B%E5%85%AC%E7%94%A8%E6%96%B9%E6%B3%95%EF%BC%9F.md) +* [Object有哪些公用方法?](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20Object%E6%9C%89%E5%93%AA%E4%BA%9B%E5%85%AC%E7%94%A8%E6%96%B9%E6%B3%95%EF%BC%9F.md) -* [[Java] Override和Overload的使用规则和区别](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20Override%E5%92%8COverload%E7%9A%84%E4%BD%BF%E7%94%A8%E8%A7%84%E5%88%99%E5%92%8C%E5%8C%BA%E5%88%AB.md) +* [Override和Overload的使用规则和区别](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20Override%E5%92%8COverload%E7%9A%84%E4%BD%BF%E7%94%A8%E8%A7%84%E5%88%99%E5%92%8C%E5%8C%BA%E5%88%AB.md) -* [[Java] Switch能否用string做参数?](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20Switch%E8%83%BD%E5%90%A6%E7%94%A8string%E5%81%9A%E5%8F%82%E6%95%B0%EF%BC%9F.md) +* [Switch能否用string做参数?](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20Switch%E8%83%BD%E5%90%A6%E7%94%A8string%E5%81%9A%E5%8F%82%E6%95%B0%EF%BC%9F.md) -* [[Java] ThreadLocal的使用规则和源码分析](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20ThreadLocal%E7%9A%84%E4%BD%BF%E7%94%A8%E8%A7%84%E5%88%99%E5%92%8C%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90.md) +* [ThreadLocal的使用规则和源码分析](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20ThreadLocal%E7%9A%84%E4%BD%BF%E7%94%A8%E8%A7%84%E5%88%99%E5%92%8C%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90.md) -* [[Java] ThreadPool用法与示例](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20ThreadPool%E7%94%A8%E6%B3%95%E4%B8%8E%E7%A4%BA%E4%BE%8B.md) +* [ThreadPool用法与示例](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20ThreadPool%E7%94%A8%E6%B3%95%E4%B8%8E%E7%A4%BA%E4%BE%8B.md) -* [[Java] equals与==的区别](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20equals%E4%B8%8E%3D%3D%E7%9A%84%E5%8C%BA%E5%88%AB.md) +* [equals与==的区别](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20equals%E4%B8%8E%3D%3D%E7%9A%84%E5%8C%BA%E5%88%AB.md) -* [[Java] try catch finally,try里有return,finally还执行么?](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20try%20catch%20finally%EF%BC%8Ctry%E9%87%8C%E6%9C%89return%EF%BC%8Cfinally%E8%BF%98%E6%89%A7%E8%A1%8C%E4%B9%88%EF%BC%9F.md) +* [try catch finally,try里有return,finally还执行么?](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20try%20catch%20finally%EF%BC%8Ctry%E9%87%8C%E6%9C%89return%EF%BC%8Cfinally%E8%BF%98%E6%89%A7%E8%A1%8C%E4%B9%88%EF%BC%9F.md) -* [[Java] 九种基本数据类型的大小,以及他们的封装类](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20%E4%B9%9D%E7%A7%8D%E5%9F%BA%E6%9C%AC%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%A4%A7%E5%B0%8F%EF%BC%8C%E4%BB%A5%E5%8F%8A%E4%BB%96%E4%BB%AC%E7%9A%84%E5%B0%81%E8%A3%85%E7%B1%BB.md) +* [九种基本数据类型的大小,以及他们的封装类](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20%E4%B9%9D%E7%A7%8D%E5%9F%BA%E6%9C%AC%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%A4%A7%E5%B0%8F%EF%BC%8C%E4%BB%A5%E5%8F%8A%E4%BB%96%E4%BB%AC%E7%9A%84%E5%B0%81%E8%A3%85%E7%B1%BB.md) -* [[Java] 从源码分析String、StringBuffer与StringBuilder区别和联系](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20%E4%BB%8E%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90String%E3%80%81StringBuffer%E4%B8%8EStringBuilder%E5%8C%BA%E5%88%AB%E5%92%8C%E8%81%94%E7%B3%BB.md) +* [从源码分析String、StringBuffer与StringBuilder区别和联系](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20%E4%BB%8E%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90String%E3%80%81StringBuffer%E4%B8%8EStringBuilder%E5%8C%BA%E5%88%AB%E5%92%8C%E8%81%94%E7%B3%BB.md) -* [[Java] 多线程下生产者消费者问题的五种同步方法实现](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20%E5%A4%9A%E7%BA%BF%E7%A8%8B%E4%B8%8B%E7%94%9F%E4%BA%A7%E8%80%85%E6%B6%88%E8%B4%B9%E8%80%85%E9%97%AE%E9%A2%98%E7%9A%84%E4%BA%94%E7%A7%8D%E5%90%8C%E6%AD%A5%E6%96%B9%E6%B3%95%E5%AE%9E%E7%8E%B0.md) +* [多线程下生产者消费者问题的五种同步方法实现](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20%E5%A4%9A%E7%BA%BF%E7%A8%8B%E4%B8%8B%E7%94%9F%E4%BA%A7%E8%80%85%E6%B6%88%E8%B4%B9%E8%80%85%E9%97%AE%E9%A2%98%E7%9A%84%E4%BA%94%E7%A7%8D%E5%90%8C%E6%AD%A5%E6%96%B9%E6%B3%95%E5%AE%9E%E7%8E%B0.md) -* [[Java] 实现多线程的两种方法](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20%E5%AE%9E%E7%8E%B0%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%9A%84%E4%B8%A4%E7%A7%8D%E6%96%B9%E6%B3%95.md) +* [实现多线程的两种方法](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20%E5%AE%9E%E7%8E%B0%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%9A%84%E4%B8%A4%E7%A7%8D%E6%96%B9%E6%B3%95.md) -* [[Java] 接口(Interface)与 抽象类 (Abstract)使用规则和区别](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20%E6%8E%A5%E5%8F%A3%EF%BC%88Interface%EF%BC%89%E4%B8%8E%20%E6%8A%BD%E8%B1%A1%E7%B1%BB%20%EF%BC%88Abstract%EF%BC%89%E4%BD%BF%E7%94%A8%E8%A7%84%E5%88%99%E5%92%8C%E5%8C%BA%E5%88%AB.md) +* [接口(Interface)与 抽象类 (Abstract)使用规则和区别](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20%E6%8E%A5%E5%8F%A3%EF%BC%88Interface%EF%BC%89%E4%B8%8E%20%E6%8A%BD%E8%B1%A1%E7%B1%BB%20%EF%BC%88Abstract%EF%BC%89%E4%BD%BF%E7%94%A8%E8%A7%84%E5%88%99%E5%92%8C%E5%8C%BA%E5%88%AB.md) -* [[Java] 方法锁、对象锁和类锁的意义和区别](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20%E6%96%B9%E6%B3%95%E9%94%81%E3%80%81%E5%AF%B9%E8%B1%A1%E9%94%81%E5%92%8C%E7%B1%BB%E9%94%81%E7%9A%84%E6%84%8F%E4%B9%89%E5%92%8C%E5%8C%BA%E5%88%AB.md) +* [方法锁、对象锁和类锁的意义和区别](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20%E6%96%B9%E6%B3%95%E9%94%81%E3%80%81%E5%AF%B9%E8%B1%A1%E9%94%81%E5%92%8C%E7%B1%BB%E9%94%81%E7%9A%84%E6%84%8F%E4%B9%89%E5%92%8C%E5%8C%BA%E5%88%AB.md) -* [[Java] 的四种引用,强弱软虚,用到的场景](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20%E7%9A%84%E5%9B%9B%E7%A7%8D%E5%BC%95%E7%94%A8%EF%BC%8C%E5%BC%BA%E5%BC%B1%E8%BD%AF%E8%99%9A%EF%BC%8C%E7%94%A8%E5%88%B0%E7%9A%84%E5%9C%BA%E6%99%AF.md) +* [四种引用,强弱软虚,用到的场景](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20%E7%9A%84%E5%9B%9B%E7%A7%8D%E5%BC%95%E7%94%A8%EF%BC%8C%E5%BC%BA%E5%BC%B1%E8%BD%AF%E8%99%9A%EF%BC%8C%E7%94%A8%E5%88%B0%E7%9A%84%E5%9C%BA%E6%99%AF.md) -* [[Java] 线程同步的方法:sychronized、lock、reentrantLock分析](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20%E7%BA%BF%E7%A8%8B%E5%90%8C%E6%AD%A5%E7%9A%84%E6%96%B9%E6%B3%95%EF%BC%9Asychronized%E3%80%81lock%E3%80%81reentrantLock%E5%88%86%E6%9E%90.md) +* [线程同步的方法:sychronized、lock、reentrantLock分析](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20%E7%BA%BF%E7%A8%8B%E5%90%8C%E6%AD%A5%E7%9A%84%E6%96%B9%E6%B3%95%EF%BC%9Asychronized%E3%80%81lock%E3%80%81reentrantLock%E5%88%86%E6%9E%90.md) -* [[Java] 集合框架的层次结构和使用规则梳理](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6%E7%9A%84%E5%B1%82%E6%AC%A1%E7%BB%93%E6%9E%84%E5%92%8C%E4%BD%BF%E7%94%A8%E8%A7%84%E5%88%99%E6%A2%B3%E7%90%86.md) +* [集合框架的层次结构和使用规则梳理](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6%E7%9A%84%E5%B1%82%E6%AC%A1%E7%BB%93%E6%9E%84%E5%92%8C%E4%BD%BF%E7%94%A8%E8%A7%84%E5%88%99%E6%A2%B3%E7%90%86.md) -* [[Java] 面向对象的三个特征与含义](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%9A%84%E4%B8%89%E4%B8%AA%E7%89%B9%E5%BE%81%E4%B8%8E%E5%90%AB%E4%B9%89.md) +* [面向对象的三个特征与含义](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%9A%84%E4%B8%89%E4%B8%AA%E7%89%B9%E5%BE%81%E4%B8%8E%E5%90%AB%E4%B9%89.md) -* [[java] static的作用和意义](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5Bjava%5D%20static%E7%9A%84%E4%BD%9C%E7%94%A8%E5%92%8C%E6%84%8F%E4%B9%89.md) +* [static的作用和意义](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5Bjava%5D%20static%E7%9A%84%E4%BD%9C%E7%94%A8%E5%92%8C%E6%84%8F%E4%B9%89.md) -* [[java] 多态实现的JVM调用过程](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5Bjava%5D%20%E5%A4%9A%E6%80%81%E5%AE%9E%E7%8E%B0%E7%9A%84JVM%E8%B0%83%E7%94%A8%E8%BF%87%E7%A8%8B.md) +* [多态实现的JVM调用过程](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5Bjava%5D%20%E5%A4%9A%E6%80%81%E5%AE%9E%E7%8E%B0%E7%9A%84JVM%E8%B0%83%E7%94%A8%E8%BF%87%E7%A8%8B.md) ## [数据结构](https://github.com/fanrunqi/ForAndroidInterview/tree/master/data%20structure) -* [[数据结构] 九大基础排序总结与对比](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20%E4%B9%9D%E5%A4%A7%E5%9F%BA%E7%A1%80%E6%8E%92%E5%BA%8F%E6%80%BB%E7%BB%93%E4%B8%8E%E5%AF%B9%E6%AF%94.md) +* [九大基础排序总结与对比](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20%E4%B9%9D%E5%A4%A7%E5%9F%BA%E7%A1%80%E6%8E%92%E5%BA%8F%E6%80%BB%E7%BB%93%E4%B8%8E%E5%AF%B9%E6%AF%94.md) -* [[数据结构] AVL树和AVL旋转、哈夫曼树和哈夫曼编码](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20AVL%E6%A0%91%E5%92%8CAVL%E6%97%8B%E8%BD%AC%E3%80%81%E5%93%88%E5%A4%AB%E6%9B%BC%E6%A0%91%E5%92%8C%E5%93%88%E5%A4%AB%E6%9B%BC%E7%BC%96%E7%A0%81.md) +* [AVL树和AVL旋转、哈夫曼树和哈夫曼编码](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20AVL%E6%A0%91%E5%92%8CAVL%E6%97%8B%E8%BD%AC%E3%80%81%E5%93%88%E5%A4%AB%E6%9B%BC%E6%A0%91%E5%92%8C%E5%93%88%E5%A4%AB%E6%9B%BC%E7%BC%96%E7%A0%81.md) -* [[数据结构] B(B-)树、B+树、B树](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20B(B-)%E6%A0%91%E3%80%81B%2B%E6%A0%91%E3%80%81B%E6%A0%91.md) +* [B(B-)树、B+树、B树](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20B(B-)%E6%A0%91%E3%80%81B%2B%E6%A0%91%E3%80%81B%E6%A0%91.md) -* [[数据结构] Hash表、Hash函数及冲突解决](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20Hash%E8%A1%A8%E3%80%81Hash%E5%87%BD%E6%95%B0%E5%8F%8A%E5%86%B2%E7%AA%81%E8%A7%A3%E5%86%B3.md) +* [Hash表、Hash函数及冲突解决](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20Hash%E8%A1%A8%E3%80%81Hash%E5%87%BD%E6%95%B0%E5%8F%8A%E5%86%B2%E7%AA%81%E8%A7%A3%E5%86%B3.md) -* [[数据结构] KMP的一个简单解释](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20KMP%E7%9A%84%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E8%A7%A3%E9%87%8A.md) +* [KMP的一个简单解释](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20KMP%E7%9A%84%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E8%A7%A3%E9%87%8A.md) -* [[数据结构] 二分查找与变种二分查找](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE%E4%B8%8E%E5%8F%98%E7%A7%8D%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.md) +* [二分查找与变种二分查找](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE%E4%B8%8E%E5%8F%98%E7%A7%8D%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.md) -* [[数据结构] 二叉树前中后、层次遍历算法](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20%E4%BA%8C%E5%8F%89%E6%A0%91%E5%89%8D%E4%B8%AD%E5%90%8E%E3%80%81%E5%B1%82%E6%AC%A1%E9%81%8D%E5%8E%86%E7%AE%97%E6%B3%95.md) +* [二叉树前中后、层次遍历算法](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20%E4%BA%8C%E5%8F%89%E6%A0%91%E5%89%8D%E4%B8%AD%E5%90%8E%E3%80%81%E5%B1%82%E6%AC%A1%E9%81%8D%E5%8E%86%E7%AE%97%E6%B3%95.md) -* [[数据结构] 图的BFS、DFS、prim、Dijkstra算法](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20%E5%9B%BE%E7%9A%84BFS%E3%80%81DFS%E3%80%81prim%E3%80%81Dijkstra%E7%AE%97%E6%B3%95.md) +* [图的BFS、DFS、prim、Dijkstra算法](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20%E5%9B%BE%E7%9A%84BFS%E3%80%81DFS%E3%80%81prim%E3%80%81Dijkstra%E7%AE%97%E6%B3%95.md) -* [[数据结构] 字符串操作](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%93%8D%E4%BD%9C.md) +* [字符串操作](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%93%8D%E4%BD%9C.md) -* [[数据结构] 数组与链表的优缺点和区别](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20%E6%95%B0%E7%BB%84%E4%B8%8E%E9%93%BE%E8%A1%A8%E7%9A%84%E4%BC%98%E7%BC%BA%E7%82%B9%E5%92%8C%E5%8C%BA%E5%88%AB.md) +* [数组与链表的优缺点和区别](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20%E6%95%B0%E7%BB%84%E4%B8%8E%E9%93%BE%E8%A1%A8%E7%9A%84%E4%BC%98%E7%BC%BA%E7%82%B9%E5%92%8C%E5%8C%BA%E5%88%AB.md) -* [[数据结构] 红黑树](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20%E7%BA%A2%E9%BB%91%E6%A0%91.md) +* [红黑树](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20%E7%BA%A2%E9%BB%91%E6%A0%91.md) -* [[数据结构] 队列和栈](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20%E9%98%9F%E5%88%97%E5%92%8C%E6%A0%88.md) +* [队列和栈](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20%E9%98%9F%E5%88%97%E5%92%8C%E6%A0%88.md) ## [算法](https://github.com/fanrunqi/ForAndroidInterview/tree/master/algorithm) @@ -180,8 +180,10 @@ ## About -   目前仓库中所有文章均为原创,如发现不妥之处,欢迎在Issues中提出,感激不尽! - 如果有资源要奉献的朋友,请也在Issues提出,我会通过id把你添加成合作者。 - - 面试经验来源于网络 +  如有什么问题,欢迎在Issues中提出! +   +## License + +> No Fucking License , No CopyRight ,Just Enjoy ! + From b3b70cf0b882631dac6519656a29063f60f5a9b9 Mon Sep 17 00:00:00 2001 From: fanrunqi Date: Thu, 23 Jun 2016 10:30:44 +0800 Subject: [PATCH 06/17] android --- ....0\346\226\260\347\211\271\346\200\247.md" | 80 +++++++++++++++++ ...24\347\224\250\345\234\272\346\231\257.md" | 8 ++ ...03\350\267\263\346\234\272\345\210\266.md" | 90 +++++++++++++++++++ ...25\347\232\204\345\214\272\345\210\253.md" | 47 ++++++++++ ...25\345\261\202\345\256\236\347\216\260.md" | 10 +++ ...on\344\274\230\345\212\243\345\212\277.md" | 29 ++++++ "android/ListView\344\274\230\345\214\226.md" | 8 ++ ...76\347\211\207\347\274\223\345\255\230.md" | 11 +++ ...44\347\261\273\345\212\250\347\224\273.md" | 9 ++ ...67\346\267\206\347\237\245\350\257\206.md" | 42 +++++++++ ...15\350\242\253\346\235\200\346\255\273.md" | 52 +++++++++++ ...00\237\345\220\257\345\212\250activity.md" | 25 ++++++ ...345\207\272\347\273\210\346\255\242App.md" | 31 +++++++ 13 files changed, 442 insertions(+) create mode 100644 "android/Android5.0\343\200\2016.0\343\200\2017.0\346\226\260\347\211\271\346\200\247.md" create mode 100644 "android/Android\344\270\255\345\274\261\345\274\225\347\224\250\344\270\216\350\275\257\345\274\225\347\224\250\347\232\204\345\272\224\347\224\250\345\234\272\346\231\257.md" create mode 100644 "android/Android\351\225\277\350\277\236\346\216\245\357\274\214\346\200\216\344\271\210\345\244\204\347\220\206\345\277\203\350\267\263\346\234\272\345\210\266.md" create mode 100644 "android/Asset\347\233\256\345\275\225\344\270\216res\347\233\256\345\275\225\347\232\204\345\214\272\345\210\253.md" create mode 100644 "android/Binder\346\234\272\345\210\266\345\216\237\347\220\206\345\222\214\345\272\225\345\261\202\345\256\236\347\216\260.md" create mode 100644 "android/Json\344\274\230\345\212\243\345\212\277.md" create mode 100644 "android/ListView\344\274\230\345\214\226.md" create mode 100644 "android/android\344\270\255\345\233\276\347\211\207\347\274\223\345\255\230.md" create mode 100644 "android/\344\270\244\347\261\273\345\212\250\347\224\273.md" create mode 100644 "android/\344\272\224\345\244\247\345\270\203\345\261\200\346\230\223\346\267\267\346\267\206\347\237\245\350\257\206.md" create mode 100644 "android/\344\277\235\350\257\201service\344\270\215\350\242\253\346\235\200\346\255\273.md" create mode 100644 "android/\345\212\240\351\200\237\345\220\257\345\212\250activity.md" create mode 100644 "android/\346\200\216\346\240\267\351\200\200\345\207\272\347\273\210\346\255\242App.md" diff --git "a/android/Android5.0\343\200\2016.0\343\200\2017.0\346\226\260\347\211\271\346\200\247.md" "b/android/Android5.0\343\200\2016.0\343\200\2017.0\346\226\260\347\211\271\346\200\247.md" new file mode 100644 index 0000000..6d953b6 --- /dev/null +++ "b/android/Android5.0\343\200\2016.0\343\200\2017.0\346\226\260\347\211\271\346\200\247.md" @@ -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、多人分享等其它特性 + + + diff --git "a/android/Android\344\270\255\345\274\261\345\274\225\347\224\250\344\270\216\350\275\257\345\274\225\347\224\250\347\232\204\345\272\224\347\224\250\345\234\272\346\231\257.md" "b/android/Android\344\270\255\345\274\261\345\274\225\347\224\250\344\270\216\350\275\257\345\274\225\347\224\250\347\232\204\345\272\224\347\224\250\345\234\272\346\231\257.md" new file mode 100644 index 0000000..db47b94 --- /dev/null +++ "b/android/Android\344\270\255\345\274\261\345\274\225\347\224\250\344\270\216\350\275\257\345\274\225\347\224\250\347\232\204\345\272\224\347\224\250\345\234\272\346\231\257.md" @@ -0,0 +1,8 @@ +  在Android应用的开发中,为了防止内存溢出,在处理一些占用内存大而且声明周期较长的对象时候,可以尽量应用软引用和弱引用技术。 +下面以使用软引用为例来详细说明。弱引用的使用方式与软引用是类似的。 + +  假设我们的应用会用到大量的默认图片,比如应用中有默认的头像,默认游戏图标等等,这些图片很多地方会用到。如果每次都去读取图片,由于读取文件需要硬件操作,速度较慢,会导致性能较低。所以我们考虑将图片缓存起来,需要的时候直接从内存中读取。但是,由于图片占用内存空间比较大,缓存很多图片需要很多的内存,就可能比较容易发生OutOfMemory异常。这时,我们可以考虑使用软引用技术来避免这个问题发生。 + +   使用软引用以后,在OutOfMemory异常发生之前,这些缓存的图片资源的内存空间可以被释放掉的,从而避免内存达到上限,避免Crash发生。 +    +  需要注意的是,在垃圾回收器对这个Java对象回收前,SoftReference类所提供的get方法会返回Java对象的强引用,一旦垃圾线程回收该Java对象之后,get方法将返回null。所以在获取软引用对象的代码中,一定要判断是否为null,以免出现NullPointerException异常导致应用崩溃。 \ No newline at end of file diff --git "a/android/Android\351\225\277\350\277\236\346\216\245\357\274\214\346\200\216\344\271\210\345\244\204\347\220\206\345\277\203\350\267\263\346\234\272\345\210\266.md" "b/android/Android\351\225\277\350\277\236\346\216\245\357\274\214\346\200\216\344\271\210\345\244\204\347\220\206\345\277\203\350\267\263\346\234\272\345\210\266.md" new file mode 100644 index 0000000..7d659f2 --- /dev/null +++ "b/android/Android\351\225\277\350\277\236\346\216\245\357\274\214\346\200\216\344\271\210\345\244\204\347\220\206\345\277\203\350\267\263\346\234\272\345\210\266.md" @@ -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被杀后会自己自动启动服务。 + + + diff --git "a/android/Asset\347\233\256\345\275\225\344\270\216res\347\233\256\345\275\225\347\232\204\345\214\272\345\210\253.md" "b/android/Asset\347\233\256\345\275\225\344\270\216res\347\233\256\345\275\225\347\232\204\345\214\272\345\210\253.md" new file mode 100644 index 0000000..7594c32 --- /dev/null +++ "b/android/Asset\347\233\256\345\275\225\344\270\216res\347\233\256\345\275\225\347\232\204\345\214\272\345\210\253.md" @@ -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 等文件。 + diff --git "a/android/Binder\346\234\272\345\210\266\345\216\237\347\220\206\345\222\214\345\272\225\345\261\202\345\256\236\347\216\260.md" "b/android/Binder\346\234\272\345\210\266\345\216\237\347\220\206\345\222\214\345\272\225\345\261\202\345\256\236\347\216\260.md" new file mode 100644 index 0000000..817f503 --- /dev/null +++ "b/android/Binder\346\234\272\345\210\266\345\216\237\347\220\206\345\222\214\345\272\225\345\261\202\345\256\236\347\216\260.md" @@ -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) \ No newline at end of file diff --git "a/android/Json\344\274\230\345\212\243\345\212\277.md" "b/android/Json\344\274\230\345\212\243\345\212\277.md" new file mode 100644 index 0000000..e0838f7 --- /dev/null +++ "b/android/Json\344\274\230\345\212\243\345\212\277.md" @@ -0,0 +1,29 @@ +**JSON的定义** + +   一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。 + +**XML的定义**  + +    扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。 + +**JSON 和 XML 优缺点的比较**  + +1. 在可读性方面,JSON和XML的数据可读性基本相同。JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负。  + +2. 在可扩展性方面,XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。  + +3. 在编码难度方面,XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。  + +4. 在解码难度方面,XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。  + +5. 在流行度方面,XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous JavaScript and JSON)了。  + +6. JSON和XML同样拥有丰富的解析手段。  + +7. JSON相对于XML来讲,数据的体积小。 + +8. JSON与JavaScript的交互更加方便。 + +9. JSON对数据的描述性比XML较差。 + +10. JSON的速度要远远快于XML。 diff --git "a/android/ListView\344\274\230\345\214\226.md" "b/android/ListView\344\274\230\345\214\226.md" new file mode 100644 index 0000000..f7464f8 --- /dev/null +++ "b/android/ListView\344\274\230\345\214\226.md" @@ -0,0 +1,8 @@ + +  重用了convertView,很大程度上的减少了内存的消耗。通过判断convertView是否为null,是的话就需要产生一个视图出来,然后给这个视图数据,最后将这个视图返回给底层,呈献给用户。 + +   每次在getVIew的时候,都需要重新的findViewById,重新找到控件,然后进行控件的赋值以及事件相应设置。这样其实在做重复的事情,因为的geiview中,其实包含有这些控件,而且这些控件的id还都是一样的,也就是其实只要在view中findViewById一次,后面无需要每次都要findViewById了。 + +  通过线程来异步加载图片,把Http的相关操作放在线程里,最好使用线程池来控制线程数。返回的bitmap通过Handler来更新每个Item布局上的ImageView(就是赋上图片)。 + +  当遇到大图片的话,可以对图片处理一下再使用,比如压缩,压缩到480*800。网上有很多关于图片压缩的资料。 diff --git "a/android/android\344\270\255\345\233\276\347\211\207\347\274\223\345\255\230.md" "b/android/android\344\270\255\345\233\276\347\211\207\347\274\223\345\255\230.md" new file mode 100644 index 0000000..13514d8 --- /dev/null +++ "b/android/android\344\270\255\345\233\276\347\211\207\347\274\223\345\255\230.md" @@ -0,0 +1,11 @@ +1.简介   + +  现在android应用中不可避免的要使用图片,有些图片是可以变化的,需要每次启动时从网络拉取,这种场景在有广告位的应用以及纯图片应用(比如百度美拍)中比较多。 + +  现在有一个问题:假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量。在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响。当然,我想,向百度美拍这样的应用,必然也有其内部的图片缓存策略。总之,图片缓存是很重要而且是必须的。 + +2.图片缓存的原理   + +  实现图片缓存也不难,需要有相应的cache策略。一般采用 内存-文件-网络 三层cache机制,其中内存缓存包括强引用缓存和软引用缓存(SoftReference),其实网络不算cache,这里也把它划到缓存的层次结构中。当根据url向网络拉取图片的时候,先从内存中找,如果内存中没有,再从缓存文件中查找,如果缓存文件中也没有,再从网络上通过http请求拉取图片。在键值对(key-value)中,这个图片缓存的key是图片url的hash值,value就是bitmap。所以,按照这个逻辑,只要一个url被下载过,其图片就被缓存起来了。 + +关于Java中对象的软引用(SoftReference),如果一个对象具有软引用,内存空间足够,垃 圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高 速缓存。使用软引用能防止内存泄露,增强程序的健壮性。 \ No newline at end of file diff --git "a/android/\344\270\244\347\261\273\345\212\250\347\224\273.md" "b/android/\344\270\244\347\261\273\345\212\250\347\224\273.md" new file mode 100644 index 0000000..3ab96f4 --- /dev/null +++ "b/android/\344\270\244\347\261\273\345\212\250\347\224\273.md" @@ -0,0 +1,9 @@ +android支持两种动画模式,tween animation,frame animation  + +  View Animation(Tween Animation):补间动画,给出两个关键帧,通过一些算法将给定属性值在给定的时间内在两个关键帧间渐变。 +  View animation只能应用于View对象,而且只支持一部分属性,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化. + +  Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影补间动画和帧动画。 +补间动画和Frame动画的定义: +  所谓补间动画,是指通过指定View的初末状态和变化时间、方式,对View的内容完成一系列的图形变换来实现动画效果。主要包括四种效果:Alpha、Scale、Translate和Rotate。 +帧动画就是Frame动画,即指定每一帧的内容和停留时间,然后播放动画 \ No newline at end of file diff --git "a/android/\344\272\224\345\244\247\345\270\203\345\261\200\346\230\223\346\267\267\346\267\206\347\237\245\350\257\206.md" "b/android/\344\272\224\345\244\247\345\270\203\345\261\200\346\230\223\346\267\267\346\267\206\347\237\245\350\257\206.md" new file mode 100644 index 0000000..df264db --- /dev/null +++ "b/android/\344\272\224\345\244\247\345\270\203\345\261\200\346\230\223\346\267\267\346\267\206\347\237\245\350\257\206.md" @@ -0,0 +1,42 @@ + +-------------------------------------------------------------------------------- + ● 线性布局(LiearLayout): 屏幕垂直或水平方向布局。 + +   具有垂直方向与水平方向的布局方式,通过设置属性“android:orientation”控制方向,属性值垂直(vertical)和水平(horizontal),默认水平方向。android:layout_weight:权重,用来分配当前控件在剩余空间的大小。正常情况下,值越大占据高度或宽度越大。例外的情况,在LineayLayout布局中使用这个属性时需要注意: 当水平方向布局且子控件的宽度为fill_parent或match_parent时,值越小占据宽度越大,垂直方向也一样。 +      +![这里写图片描述](http://img.blog.csdn.net/20160623095128454) + + +    这里出现这种情况主要是因为match_parent或fill_parent引起的,系统先给第一个子控件分配parent_width(剩余空间),再给第二个分配parent_width,即分配了两个parent_width,此时剩余为parent_width-2parent_width=-parent_width,这里主要问题就在这里,剩余控件其实已经为一个负数了。接着,第一个控件占宽度:parent_width(当前已有宽度)+权重1/3*(-parent_width)=2/3parent_width;第二个控件占宽度:parent_width+权重2/3*(-parent_width)=1/3parent_width,所以当宽度都是match_parent时,剩余空间则为负数,谁的权重大谁就会减去越多。 +   +-------------------------------------------------------------------------------- + + ● 帧布局(FrameLayout):控件从屏幕左上角开始布局。  +    +    帧布局或叫层布局,从屏幕左上角按照层次堆叠方式布局,后面的控件覆盖前面的控件。比如百度地图。 +     + +    + ● 相对布局(RelativeLayout): 以其他控件为参照布局。 + + 相对布局可以让子控件相对于兄弟控件或父控件进行布局,可以设置子控件相对于兄弟控件或父控件进行上下左右对齐。RelativeLayout能替换一些嵌套视图,当我们用LinearLayout来实现一个简单的布局但又使用了过多的嵌套时,就可以考虑使用RelativeLayout重新布局。 + + ● 绝对布局(AbsoluteLayout):以屏幕坐标布局。 + +  绝对布局也叫坐标布局,指定控件的绝对位置,简单直接,直观性强,但是手机屏幕尺寸差别较大,适应性差,Android 1.5已弃用,可以用RelativeLayout替代。 + + ● 表格布局(TableLayout):按照行列方式布局。 + +  表格布局继承自LinearLayout,通过TableRow设置行,列数由TableRow中的子控件决定,直接在TableLayout中添加子控件会占据整个一行。 + +-------------------------------------------------------------------------------- +性能优化: + +使用抽象布局标签(include, viewstub, merge) +去除不必要的嵌套和View节点 +在LinearLayout中慎用layout_weight(绘制2次); + + + + + diff --git "a/android/\344\277\235\350\257\201service\344\270\215\350\242\253\346\235\200\346\255\273.md" "b/android/\344\277\235\350\257\201service\344\270\215\350\242\253\346\235\200\346\255\273.md" new file mode 100644 index 0000000..8041d50 --- /dev/null +++ "b/android/\344\277\235\350\257\201service\344\270\215\350\242\253\346\235\200\346\255\273.md" @@ -0,0 +1,52 @@ +一、onStartCommand方法,返回START_STICKY + +  在运行onStartCommand后service进程被kill后,那将保留在开始状态,但是不保留那些传入的intent。不久后service就会再次尝试重新创建,因为保留在开始状态,在创建 service后将保证调用onstartCommand。如果没有传递任何开始命令给service,那将获取到null的intent。 + +   【结论】 手动返回START_STICKY,亲测当service因内存不足被kill,当内存又有的时候,service又被重新创建,比较不错,但是不能保证任何情况下都被重建,比如进程被干掉了....  + +二、提升service优先级 + +  在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = "1000"这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时适用于广播。 + +三、提升service进程优先级 + +  Android中的进程是托管的,当系统进程空间紧张的时候,会依照优先级自动进行进程的回收。Android将进程分为6个等级,它们按优先级顺序由高到低依次是: + 1.前台进程( FOREGROUND_APP) + 2.可视进程(VISIBLE_APP ) + 3. 次要服务进程(SECONDARY_SERVER ) + 4.后台进程 (HIDDEN_APP) + 5.内容供应节点(CONTENT_PROVIDER) + 6.空进程(EMPTY_APP) +当service运行在低内存的环境时,将会kill掉一些存在的进程。因此进程的优先级将会很重要,可以使用startForeground 将service放到前台状态。这样在低内存时被kill的几率会低一些。 + +在onStartCommand方法内添加如下代码: + + + +``` +Notification notification = new Notification(R.drawable.ic_launcher, + getString(R.string.app_name), System.currentTimeMillis()); + + PendingIntent pendingintent = PendingIntent.getActivity(this, 0, + new Intent(this, AppMain.class), 0); + notification.setLatestEventInfo(this, "uploadservice", "请保持程序在后台运行", + pendingintent); + startForeground(0x111, notification); +``` + +注意在onDestroy里还需要stopForeground(true),运行时在下拉列表会看到自己的APP在: +【结论】如果在极度极度低内存的压力下,该service还是会被kill掉,并且不一定会restart + +四、onDestroy方法里重启service + +  直接在onDestroy()里startService  +  或 +  service +broadcast 方式,就是当service走ondestory的时候,发送一个自定义的广播,当收到广播的时候,重新启动service; + +【结论】当使用类似口口管家等第三方应用或是在setting里-应用-强制停止时,APP进程可能就直接被干掉了,onDestroy方法都进不来,所以还是无法保证~.~ + +五、监听系统广播判断Service状态 + +  通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的Service是否还存活,别忘记加权限啊。 + +六、将APK安装到/system/app,变身系统级应用 diff --git "a/android/\345\212\240\351\200\237\345\220\257\345\212\250activity.md" "b/android/\345\212\240\351\200\237\345\220\257\345\212\250activity.md" new file mode 100644 index 0000000..74cc205 --- /dev/null +++ "b/android/\345\212\240\351\200\237\345\220\257\345\212\250activity.md" @@ -0,0 +1,25 @@ +  减少onCreate的时间,那就精简onCreate里的代码。放在onResume里好了。为了用户体验更好一些,把页面显示的View细分一下,放在AsyncTask里逐步显示,如果你够熟练,用handler更好,这样用户的看到的就是有层次有步骤的一个个的view的展示,不会是先看到一个黑屏,然后一下显示所有view。最好作成动画,效果更自然些。利用多线程的目的就是尽可能的减少onCreate和onReume的时间,使得用户能尽快看到页面,操作页面。 +   +   但是,很多操作是只需要一次初始化的,都放在onResume里每次进入activity都会浪费初始化时间。这个好解决,做一个boolean变量,在onCreate里标记为true。在onResume里判断为true就进行初始化,初始化完成立刻置为false。搞定。 + + +1.减小主线程的阻塞时间  + +  若一个操作耗时教长(超过5秒 用户无响应5秒 网络和数据库阻塞10秒 广播接收者执行超过10秒会导致ANR),我们应该将其放入后台线程中执行,只在需要修改UI界面时通知主线程进行修改。 + Android已经提供了AsynTask以实现从主线程生成新的异步任务的方法。具体用法参见异步任务。  + +2.提高Adapter和AdapterView的效率 + (1)重用已生成过的Item View + (2) 添加ViewHolder + (3) 缓存Item的数据 + (4)分段显示  + +3.优化布局文件 + 如果我们的布局层次过多,那么在我们用findViewById的时间必然会变多,一个变多可能不要紧,但是有很多调用必然会影响性能。 + + (1) 使用观察布局的工具 Hierarchy Viewer + + (2)使用布局优化工具: Layoutopt + + (3)优化布局的层次结构 + diff --git "a/android/\346\200\216\346\240\267\351\200\200\345\207\272\347\273\210\346\255\242App.md" "b/android/\346\200\216\346\240\267\351\200\200\345\207\272\347\273\210\346\255\242App.md" new file mode 100644 index 0000000..0e4acda --- /dev/null +++ "b/android/\346\200\216\346\240\267\351\200\200\345\207\272\347\273\210\346\255\242App.md" @@ -0,0 +1,31 @@ + +1. + +在application中定义一个单例模式的Activity栈来管理所有Activity。并提供退出所有Activity的方法。 + +2. + +AndroidManifest.xml 添加权限 + + +退出应用的方法: + +ActivityManager am= (ActivityManager) this + .getSystemService(Context.ACTIVITY_SERVICE); +am.killBackgroundProcesses(this.getPackageName()); + +3. + + Dalvik VM的本地方法 + android.os.Process.killProcess(android.os.Process.myPid()) //获取PID + System.exit(0); //常规java、c#的标准退出法,返回值为0代表正常退出 + +4. + +Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在A窗口打开B窗口时在Intent中直接加入标 志 Intent.FLAG_ACTIVITY_CLEAR_TOP,这样开启B时将会清除该进程空间的所有Activity。 +在A窗口中使用下面的代码调用B窗口 +Intent intent = new Intent(); +intent.setClass(this, B.class); +intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //注意本行的FLAG设置 +startActivity(intent); +接下来在B窗口中需要退出时直接使用finish方法即可全部退出。 \ No newline at end of file From 299051923327ca298f12b3c8aaa58dd9f6a2abf2 Mon Sep 17 00:00:00 2001 From: fanrunqi Date: Thu, 23 Jun 2016 10:38:34 +0800 Subject: [PATCH 07/17] Update README.md --- README.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/README.md b/README.md index e42b24a..11221c3 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,37 @@ * [Android 名企面试题及答案整理(一)](https://github.com/fanrunqi/ForAndroidInterview/blob/master/android/%5BAndroid%5D%20%E5%90%8D%E4%BC%81%E9%9D%A2%E8%AF%95%E9%A2%98%EF%BC%88%E4%B8%80%EF%BC%89.md) + + +* [Android5.0、6.0、7.0新特性](https://github.com/fanrunqi/AndroidInterview/blob/master/android/Android5.0%E3%80%816.0%E3%80%817.0%E6%96%B0%E7%89%B9%E6%80%A7.md) + +* [Android中弱引用与软引用的应用场景](https://github.com/fanrunqi/AndroidInterview/blob/master/android/Android%E4%B8%AD%E5%BC%B1%E5%BC%95%E7%94%A8%E4%B8%8E%E8%BD%AF%E5%BC%95%E7%94%A8%E7%9A%84%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF.md) + +* [Android长连接,怎么处理心跳机制](https://github.com/fanrunqi/AndroidInterview/blob/master/android/Android%E9%95%BF%E8%BF%9E%E6%8E%A5%EF%BC%8C%E6%80%8E%E4%B9%88%E5%A4%84%E7%90%86%E5%BF%83%E8%B7%B3%E6%9C%BA%E5%88%B6.md) + +* [Asset目录与res目录的区别](https://github.com/fanrunqi/AndroidInterview/blob/master/android/Asset%E7%9B%AE%E5%BD%95%E4%B8%8Eres%E7%9B%AE%E5%BD%95%E7%9A%84%E5%8C%BA%E5%88%AB.md) + +* [Binder机制原理和底层实现](https://github.com/fanrunqi/AndroidInterview/blob/master/android/Binder%E6%9C%BA%E5%88%B6%E5%8E%9F%E7%90%86%E5%92%8C%E5%BA%95%E5%B1%82%E5%AE%9E%E7%8E%B0.md) + +* [Json优劣势](https://github.com/fanrunqi/AndroidInterview/blob/master/android/Json%E4%BC%98%E5%8A%A3%E5%8A%BF.md) + +* [ListView优化](https://github.com/fanrunqi/AndroidInterview/blob/master/android/ListView%E4%BC%98%E5%8C%96.md) + +* [android中图片缓存](https://github.com/fanrunqi/AndroidInterview/blob/master/android/android%E4%B8%AD%E5%9B%BE%E7%89%87%E7%BC%93%E5%AD%98.md) + +* [两类动画](https://github.com/fanrunqi/AndroidInterview/blob/master/android/%E4%B8%A4%E7%B1%BB%E5%8A%A8%E7%94%BB.md) + +* [五大布局易混淆知识](https://github.com/fanrunqi/AndroidInterview/blob/master/android/%E4%BA%94%E5%A4%A7%E5%B8%83%E5%B1%80%E6%98%93%E6%B7%B7%E6%B7%86%E7%9F%A5%E8%AF%86.md) + +* [保证service不被杀死](https://github.com/fanrunqi/AndroidInterview/blob/master/android/%E4%BF%9D%E8%AF%81service%E4%B8%8D%E8%A2%AB%E6%9D%80%E6%AD%BB.md) + +* [加速启动activity](https://github.com/fanrunqi/AndroidInterview/blob/master/android/%E5%8A%A0%E9%80%9F%E5%90%AF%E5%8A%A8activity.md) + +* [怎样退出终止App](https://github.com/fanrunqi/AndroidInterview/blob/master/android/%E6%80%8E%E6%A0%B7%E9%80%80%E5%87%BA%E7%BB%88%E6%AD%A2App.md) + +* [布局性能优化(include, viewstub, merge)](http://www.trinea.cn/android/layout-performance/) + +* [DOM、SAX、Pull解析XML](http://www.cnblogs.com/xiaoluo501395377/p/3444744.html) ## [Java](https://github.com/fanrunqi/ForAndroidInterview/tree/master/java) From 1b8e8189603b354a4d0507e5ae8cf326c6bdf18b Mon Sep 17 00:00:00 2001 From: fanrunqi Date: Thu, 23 Jun 2016 10:42:31 +0800 Subject: [PATCH 08/17] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 11221c3..3feebf0 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ * [Android 名企面试题及答案整理(一)](https://github.com/fanrunqi/ForAndroidInterview/blob/master/android/%5BAndroid%5D%20%E5%90%8D%E4%BC%81%E9%9D%A2%E8%AF%95%E9%A2%98%EF%BC%88%E4%B8%80%EF%BC%89.md) - +*** * [Android5.0、6.0、7.0新特性](https://github.com/fanrunqi/AndroidInterview/blob/master/android/Android5.0%E3%80%816.0%E3%80%817.0%E6%96%B0%E7%89%B9%E6%80%A7.md) From 90cf08adf4da530ec85d46a94749cd53de00e1b2 Mon Sep 17 00:00:00 2001 From: fanrunqi Date: Thu, 23 Jun 2016 10:45:46 +0800 Subject: [PATCH 09/17] =?UTF-8?q?Update=20Json=E4=BC=98=E5=8A=A3=E5=8A=BF.?= =?UTF-8?q?md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...on\344\274\230\345\212\243\345\212\277.md" | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git "a/android/Json\344\274\230\345\212\243\345\212\277.md" "b/android/Json\344\274\230\345\212\243\345\212\277.md" index e0838f7..77a47f8 100644 --- "a/android/Json\344\274\230\345\212\243\345\212\277.md" +++ "b/android/Json\344\274\230\345\212\243\345\212\277.md" @@ -8,22 +8,22 @@ **JSON 和 XML 优缺点的比较**  -1. 在可读性方面,JSON和XML的数据可读性基本相同。JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负。  +1.在可读性方面,JSON和XML的数据可读性基本相同。JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负。  -2. 在可扩展性方面,XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。  +2.在可扩展性方面,XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。  -3. 在编码难度方面,XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。  +3.在编码难度方面,XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。  -4. 在解码难度方面,XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。  +4.在解码难度方面,XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。  -5. 在流行度方面,XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous JavaScript and JSON)了。  +5.在流行度方面,XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous JavaScript and JSON)了。  -6. JSON和XML同样拥有丰富的解析手段。  +6.JSON和XML同样拥有丰富的解析手段。  -7. JSON相对于XML来讲,数据的体积小。 +7.JSON相对于XML来讲,数据的体积小。 -8. JSON与JavaScript的交互更加方便。 +8.JSON与JavaScript的交互更加方便。 -9. JSON对数据的描述性比XML较差。 +9.JSON对数据的描述性比XML较差。 -10. JSON的速度要远远快于XML。 +10.JSON的速度要远远快于XML。 From 83c560656513dfbb1af643e4fc8aeee7d45926cb Mon Sep 17 00:00:00 2001 From: fanrunqi Date: Thu, 23 Jun 2016 11:22:16 +0800 Subject: [PATCH 10/17] =?UTF-8?q?Create=20wait()=E5=92=8Csleep()=E7=9A=84?= =?UTF-8?q?=E5=8C=BA=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2\214sleep()\347\232\204\345\214\272\345\210\253" | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 "java/wait()\345\222\214sleep()\347\232\204\345\214\272\345\210\253" diff --git "a/java/wait()\345\222\214sleep()\347\232\204\345\214\272\345\210\253" "b/java/wait()\345\222\214sleep()\347\232\204\345\214\272\345\210\253" new file mode 100644 index 0000000..80278fd --- /dev/null +++ "b/java/wait()\345\222\214sleep()\347\232\204\345\214\272\345\210\253" @@ -0,0 +1,12 @@ +① 这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。 +sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。 + +② 锁: 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。 +sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。 +Thread.sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。 + +③ 使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。 + synchronized(x){ + x.notify() + //或者wait() + } From bf5bbfbe40cb9c040847ba91d72126d9cefc5ea4 Mon Sep 17 00:00:00 2001 From: fanrunqi Date: Thu, 23 Jun 2016 11:24:46 +0800 Subject: [PATCH 11/17] =?UTF-8?q?Delete=20wait()=E5=92=8Csleep()=E7=9A=84?= =?UTF-8?q?=E5=8C=BA=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2\214sleep()\347\232\204\345\214\272\345\210\253" | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 "java/wait()\345\222\214sleep()\347\232\204\345\214\272\345\210\253" diff --git "a/java/wait()\345\222\214sleep()\347\232\204\345\214\272\345\210\253" "b/java/wait()\345\222\214sleep()\347\232\204\345\214\272\345\210\253" deleted file mode 100644 index 80278fd..0000000 --- "a/java/wait()\345\222\214sleep()\347\232\204\345\214\272\345\210\253" +++ /dev/null @@ -1,12 +0,0 @@ -① 这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。 -sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。 - -② 锁: 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。 -sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。 -Thread.sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。 - -③ 使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。 - synchronized(x){ - x.notify() - //或者wait() - } From cc81bcfb27f56f3cdd715b001c2bd83dd5ca507e Mon Sep 17 00:00:00 2001 From: fanrunqi Date: Thu, 23 Jun 2016 11:27:04 +0800 Subject: [PATCH 12/17] fanrunqi --- ...07\346\215\242\345\212\250\347\224\273.md" | 392 ++++++++++++++++++ ...344\270\216C++\345\257\271\346\257\224.md" | 32 ++ ...75\344\273\244\344\275\277\347\224\250.md" | 44 ++ ...()\347\232\204\345\214\272\345\210\253.md" | 17 + 4 files changed, 485 insertions(+) create mode 100644 "android/activity\345\210\207\346\215\242\345\212\250\347\224\273.md" create mode 100644 "java/Java\344\270\216C++\345\257\271\346\257\224.md" create mode 100644 "java/git\345\221\275\344\273\244\344\275\277\347\224\250.md" create mode 100644 "java/wait()\345\222\214sleep()\347\232\204\345\214\272\345\210\253.md" diff --git "a/android/activity\345\210\207\346\215\242\345\212\250\347\224\273.md" "b/android/activity\345\210\207\346\215\242\345\212\250\347\224\273.md" new file mode 100644 index 0000000..b6106e5 --- /dev/null +++ "b/android/activity\345\210\207\346\215\242\345\212\250\347\224\273.md" @@ -0,0 +1,392 @@ + **android中设置activity切换动画有 两种实现方式** + + 1 . 在 AndroidManifest.xml 文件activity标签中,通过设置 android:theme 主题属性来自定义我们 Activity的切换动画( 主题可以定义很多属性,动画只是其中之一)。 + + +``` + + +``` + +首先要定义自己的主题,打开res/values/styles.xml文件,加入 + +``` + +``` +然后继续定义具体切换动画样式,分为4种需要动画的情况。 + +打开新界面时 : + + + - 新界面出现(android:activityOpenEnterAnimation) + - 当前界面消失(android:activityOpenExitAnimation) + +返回上一界面时: + + - 当前界面消失(android:activityCloseExitAnimation) + - 上一界面出现(android:activityCloseEnterAnimation) + +> a、b、c、d为自定义在res/anim下的具体动画效果文件(下面贴出) + +``` + +``` + +2 . 在Android的2.0版本之后,加入了overridePendingTransition()这个函数来帮我们实现activity切换动画,它**在startActivity()或者finish()函数之后调用** + +![这里写图片描述](http://img.blog.csdn.net/20160408111715900) + +它有两个参数, +enterAnim是下一界面进入效果的xml文件的id, +exitAnim是当前界面退出效果的xml文件id。 + +> 我们可以看出它也实现了第一种方式的四种动画情况。 + +注意: + + - 当我们不想要动画时,设置为 0 即可。 + - 我们可以看出这个方法是定义在android.app.Activity下的,如果我们用自定义的view或fragment等嵌入到Activity中,调用这个函数时很可能不起作用。一般改写为this.getParent().overridePendingTransition 就可以解决。 + +3 .上 res/anim 下的各种动画文件 + +zoomin.xml: + +``` + + + + + + + +``` +zoomout.xml + +``` + + + + + + + +``` +out_from_right.xml + +``` + + + + + +``` + +in_from_left.xml + +``` + + + + + +``` +out_from_left.xml + +``` + + + + + +``` + +in_from_right.xml + +``` + + + + +``` +fade.xml + +``` + + + + +``` + +hold.xml + +``` + + + + +``` +hyperspace_in.xml + +``` + + + + +``` + +hyperspace_out.xml + +``` + + + + + + + + + + + + + +``` +alpha_action.xml + +``` + + + + + +``` +scale_action.xml + +``` + + + + +``` + +scale_rotate.xml + +``` + + + + + + + + +``` + +scale_translate.xml + +``` + + + + + + + + +``` +scale_translate_rotate.xml + +``` + + + + + + + + + + +``` + +slide_down_out.xml + +``` + + + + +``` + +wave_scale.xml + +``` + + + + + + + + + + +``` \ No newline at end of file diff --git "a/java/Java\344\270\216C++\345\257\271\346\257\224.md" "b/java/Java\344\270\216C++\345\257\271\346\257\224.md" new file mode 100644 index 0000000..4234e52 --- /dev/null +++ "b/java/Java\344\270\216C++\345\257\271\346\257\224.md" @@ -0,0 +1,32 @@ +指针 +Java 没有指针的概念,从而有效地防止了在 C/C++语言中,容易出现的指针操作失误(如指针悬空所造成的系统崩溃)。在 C/C++中,指针操作内存时,经常会出现错误。在Java 中没有指针,更有利于 Java 程序的安全。 + +多重继承 +C++支持多重继承,它允许多父类派生一个子类。也就是说,一个类允许继承多个父类。尽管多重继承功能很强,但使用复杂,而且会引起许多麻烦,编译程序实现它也很不容易。所以 Java 不支持多重继承,但允许一个类实现多个接口。可见,Java 既实现了 C++多重继承的功能,又避免了 C++的许多缺陷。 + +数据类型 +Java 是完全面向对象的语言,所有方法和数据都必须是类的一部分。除了基本数据类型之外,其余类型的数据都作为对象型数据。例如对象型数据包括字符串和数组。类将数据和方法结合起来,把它们封装在其中,这样每个对象都可实现具有自己特点的行为。而 C++将函数和变量定义为全局的,然后再来调用这些函数和变量,从而增加了程序的负担。此外,Java 还取消了 C/C++中的结构和联合,使编译程序更简洁。 + +自动内存管理 +Java 程序中所有的对象都是用 new 操作符建立在堆栈上的,这个操作符类似于 C++的“new”操作符。Java 自动进行无用内存回收操作,不需要程序员进行删除。当 Java 中一个对象不再被用到时,无须使用内存回收器,只需要给它加上标签以示删除。无用内存的回收器在后台运行,利用空闲时间工作。而 C++中必须由程序释放内存资源,增加了程序设计者的负担。 + +操作符重载 +Java 不支持操作符重载,操作符重载被认为是 C++的突出特征。在 Java 中虽然类可以实现这样的功能,但不支持操作符重载,这样是为了保持 Java 语言尽可能简单。 + +预处理功能 +C/C++在编译过程中都有一个预编译阶段,即预处理器。预处理器为开发人员提供了方便,但增加了编译的复杂性。Java 允许预处理,但不支持预处理器功能,因为 Java 没有预处理器,所以为了实现预处理,它提供了引入语句(import),它与 C++预处理器的功能类似。 + +Java 不支持缺省函数参数,而 C++支持。 +在 C 中,代码组织在函数中,函数可以访问程序的全局变量。C++增加了类,提供了类算法,该算法是与类相连的函数,C++类方法与 Java 类方法十分相似。由于 C++仍然支持 C,所以 C++程序中仍然可以使用 C 的函数,结果导致函数和方法混合使用,使得 C++程序比较混乱。 + +Java 没有函数,作为一个比 C++更纯的面向对象的语言。Java 强迫开发人员把所有例行程序包括在类中。事实上,用方法实现例行程序可激励开发人员更好地组织编码。 + +字符串 +C 和 C++不支持字符串变量,在 C 和 C++程序中使用“Null”终止符代表字符串的结束,在 Java 中字符串是用类对象(String 和 StringBuffer)来实现的,在整个系统中建立字符串和访问字符串元素的方法是一致的。Java 字符串类是作为 Java 语言的一部分定义的,而不是作为外加的延伸部分。此外,Java 还可以对字符串用“+”进行连接操作。 + +goto 语句 +“可怕”的 goto 语句是 C 和 C++的“遗物”。它是该语言技术上的合法部分,引用 goto语句造成了程序结构的混乱,不易理解。goto 语句一般用于无条件转移子程序和多结构分支技术。Java 不提供 goto 语句,其虽然指定 goto 作为关键字,但不支持它的使用,这使程序更简洁易读。 + +类型转换 +在 C 和 C++中,有时出现数据类型的隐含转换,这就涉及了自动强制类型转换问题。例如,在 C++中可将一个浮点值赋予整型变量,并去掉其尾数。Java 不支持 C++中的自动强制类型转换,如果需要,必须由程序显式进行强制类型转换。 +[图片] diff --git "a/java/git\345\221\275\344\273\244\344\275\277\347\224\250.md" "b/java/git\345\221\275\344\273\244\344\275\277\347\224\250.md" new file mode 100644 index 0000000..f73c0bb --- /dev/null +++ "b/java/git\345\221\275\344\273\244\344\275\277\347\224\250.md" @@ -0,0 +1,44 @@ + + + +**Commit(提交)**: 点击会出现如下界面,commit message输入你提交的信息,一般是做了什么修改和工作,项目所有者和提交者会自动生成。下面Files选择哪些你做了修改的文件进行提交(这里注意你的.gitigonre文件的配置,没有的话新建一个加入相应的过滤规则,一般来说.class文件是不用提交的,否则别人提交就会有冲突)。最后Commit and push 是把你这次提交到本地仓库同时推送到服务器上的仓库中,而Commit是将本地修改保存到本地仓库中。 + +![这里写图片描述](http://img.blog.csdn.net/20160411174207005) + + +**stashes(储藏)**: 举个例,今天测试发现我昨天提交代码中有bug,然而我今天来后又做了些新功能,测试又让我马上修复bug,没办法只能改为去修复bug。那么stashes命令就派上用处了,它会把今天做的工作储藏到缓冲区,把工作目录和索引里的内容恢复到上次提交的状态,接下来我就可以修改bug了。修改完成后我把项目再提交一个版本给测试,然后我再找到我stashes的相应节点恢复我的工作目录,继续写我今天的东西。 + + +**push to Upstream(推送到远程分支)**: 先说明下upstream是什么,举个例,我在本地仓库中新建了一个分支a,把代码推送到远程仓库的分支b,那么分支b就是分支a的 upstream,反之分支a是分支b的downstream。 + + +**Fetch from Upstream(拉取远程仓库分支到本地)**: upstream上面说了,我们来说说fetch和pull的区别,都是从远程仓库拉取,fetch直接获取最新版本不做合并,而pull是获取最新版本并合并到本地。简单的说就是 pull = fetch + merge 。 + + +**push branch 'master'**(推送到master分支): 在 Git 的实现中每次提交都会保存一个提交对象,该对象包含0个或多个(第一次提交没有父对象)指向该对象的父对象指针,包含一个指向暂存内容的指针和本次提交的作者、时间等相关附属信息。Git会使用master作为分支的默认名称。 + + +**Pull**(拉取远程仓库分支到本地并与本地分支合并): 建议少用 Pull 多用 Fetch 和 Merge,pull把很多细节都隐藏起来了,不利于理解结构同时一旦出错也不容易找到出错的地方。 + + +**Remote/Push**(推送到远程代码库): remote命令用于管理远程主机, Tag指某个分支某个时间的特定状态,一般用于标记版本号。下面两个在远程代码库地址改变时需要配置。 + + ![这里写图片描述](http://img.blog.csdn.net/20160411174320053) + + +**merge**(合并): 将其他分支的内容合并到当前分支中。 + + +**rebase**(修改合并): 将一个分支修改合并到当前分支。这里说一下merge和rebase的区别:merge是直接合并分支,如果有冲突,完成后在一并解决。 rebase则是按时间线依次合并,如果产生冲突,会提示你进行处理,处理好了可以continue直到rebase完成,如果冲突处理不好可以放弃rebase或skip。 + + +**Reset** (回溯):可以将当前分支切换到本分支以前的任何一个版本状态。 + + +**patch**(补丁): 生成文件的对比信息,可以通过diff(apply)生成的标准patch,或使用format-patch生成的git专用patch。 + + +**Index**(暂存区): 是一个包含文件索引的目录树,记录了一些文件的信息,如文件名、状态、时间戳、长度等。当解决完git冲突时要把文件 add to index + + + diff --git "a/java/wait()\345\222\214sleep()\347\232\204\345\214\272\345\210\253.md" "b/java/wait()\345\222\214sleep()\347\232\204\345\214\272\345\210\253.md" new file mode 100644 index 0000000..0b0185e --- /dev/null +++ "b/java/wait()\345\222\214sleep()\347\232\204\345\214\272\345\210\253.md" @@ -0,0 +1,17 @@ +  这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。 +sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。 + +  锁: 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。   +   +  sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。 +Thread.sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。 + + 使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。 + +``` + synchronized(x){ + x.notify() + //或者wait() + } +``` + From f152a3922037e576104f8229a561cecf710ddc31 Mon Sep 17 00:00:00 2001 From: fanrunqi Date: Thu, 23 Jun 2016 11:30:56 +0800 Subject: [PATCH 13/17] Update README.md --- README.md | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/README.md b/README.md index 3feebf0..dc7a16c 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,9 @@ ## [Android](https://github.com/fanrunqi/ForAndroidInterview/tree/master/android) +##### 基础 +*** + * [全面了解Activity](https://github.com/fanrunqi/ForAndroidInterview/blob/master/android/%E5%85%A8%E9%9D%A2%E4%BA%86%E8%A7%A3Activity.md) * [Service全面总结](https://github.com/fanrunqi/ForAndroidInterview/blob/master/android/Service%E5%85%A8%E9%9D%A2%E6%80%BB%E7%BB%93.md) @@ -66,12 +69,23 @@ * [怎样退出终止App](https://github.com/fanrunqi/AndroidInterview/blob/master/android/%E6%80%8E%E6%A0%B7%E9%80%80%E5%87%BA%E7%BB%88%E6%AD%A2App.md) +* [activity切换动画](https://github.com/fanrunqi/AndroidInterview/blob/master/android/activity%E5%88%87%E6%8D%A2%E5%8A%A8%E7%94%BB.md) + + +##### 外链 +*** + * [布局性能优化(include, viewstub, merge)](http://www.trinea.cn/android/layout-performance/) * [DOM、SAX、Pull解析XML](http://www.cnblogs.com/xiaoluo501395377/p/3444744.html) + + ## [Java](https://github.com/fanrunqi/ForAndroidInterview/tree/master/java) +##### 基础 +*** + * [ArrayList、LinkedList、Vector的区别](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20ArrayList%E3%80%81LinkedList%E3%80%81Vector%E7%9A%84%E5%8C%BA%E5%88%AB.md) * [Collection包结构,与Collections的区别](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20Collection%E5%8C%85%E7%BB%93%E6%9E%84%EF%BC%8C%E4%B8%8ECollections%E7%9A%84%E5%8C%BA%E5%88%AB.md) @@ -124,9 +138,34 @@ * [多态实现的JVM调用过程](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5Bjava%5D%20%E5%A4%9A%E6%80%81%E5%AE%9E%E7%8E%B0%E7%9A%84JVM%E8%B0%83%E7%94%A8%E8%BF%87%E7%A8%8B.md) +* [wait()和sleep()的区别](https://github.com/fanrunqi/AndroidInterview/blob/master/java/wait()%E5%92%8Csleep()%E7%9A%84%E5%8C%BA%E5%88%AB.md) + +* [git命令使用](https://github.com/fanrunqi/AndroidInterview/blob/master/java/git%E5%91%BD%E4%BB%A4%E4%BD%BF%E7%94%A8.md) + +* [Java与C++对比](https://github.com/fanrunqi/AndroidInterview/blob/master/java/Java%E4%B8%8EC%2B%2B%E5%AF%B9%E6%AF%94.md) + +##### 外链 +*** + +* [java反射](http://762626559-qq-com.iteye.com/blog/395402) + +* [java回调](http://blog.csdn.net/xiaanming/article/details/8703708/) + +* [Java泛型](http://www.weixueyuan.net/view/6321.html) + +* [java 新特性](http://www.cnblogs.com/langtianya/p/3757993.html) + +* [Java IO与NIO](http://www.iteye.com/topic/834447) + +* [foreach与正常for循环效率对比](http://www.xuebuyuan.com/780786.html) + + ## [数据结构](https://github.com/fanrunqi/ForAndroidInterview/tree/master/data%20structure) +##### 基础 +*** + * [九大基础排序总结与对比](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20%E4%B9%9D%E5%A4%A7%E5%9F%BA%E7%A1%80%E6%8E%92%E5%BA%8F%E6%80%BB%E7%BB%93%E4%B8%8E%E5%AF%B9%E6%AF%94.md) * [AVL树和AVL旋转、哈夫曼树和哈夫曼编码](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20AVL%E6%A0%91%E5%92%8CAVL%E6%97%8B%E8%BD%AC%E3%80%81%E5%93%88%E5%A4%AB%E6%9B%BC%E6%A0%91%E5%92%8C%E5%93%88%E5%A4%AB%E6%9B%BC%E7%BC%96%E7%A0%81.md) @@ -151,8 +190,16 @@ * [队列和栈](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20%E9%98%9F%E5%88%97%E5%92%8C%E6%A0%88.md) +##### 外链 +*** + +* [海量数据处理 ](http://blog.csdn.net/zyq522376829/article/details/47686867) + ## [算法](https://github.com/fanrunqi/ForAndroidInterview/tree/master/algorithm) +##### 基础 +*** + * [二叉搜索树与双向链表](https://github.com/fanrunqi/ForAndroidInterview/blob/master/algorithm/swordForOffer/%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%8E%E5%8F%8C%E5%90%91%E9%93%BE%E8%A1%A8.md) * [二叉树中 和为某值 的所有路径](https://github.com/fanrunqi/ForAndroidInterview/blob/master/algorithm/swordForOffer/%E4%BA%8C%E5%8F%89%E6%A0%91%E4%B8%AD%20%E5%92%8C%E4%B8%BA%E6%9F%90%E5%80%BC%20%E7%9A%84%E6%89%80%E6%9C%89%E8%B7%AF%E5%BE%84.md) @@ -209,6 +256,19 @@ * [顺时针打印矩阵](https://github.com/fanrunqi/ForAndroidInterview/blob/master/algorithm/swordForOffer/%E9%A1%BA%E6%97%B6%E9%92%88%E6%89%93%E5%8D%B0%E7%9F%A9%E9%98%B5.md) +##### 外链 +*** + +* [分治算法](http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741370.html) + +* [动态规划](http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741374.html) + +* [贪心算法](http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741375.html) + +* [分支限界法](http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741378.html) + + + ## About  如有什么问题,欢迎在Issues中提出! From e8a089c7049929eab59c848706eb4cc32ff6c062 Mon Sep 17 00:00:00 2001 From: fanrunqi Date: Thu, 23 Jun 2016 11:39:42 +0800 Subject: [PATCH 14/17] Update README.md --- README.md | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index dc7a16c..64abb0d 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,11 @@ ## Android 名企面试题及涉及知识点整理。 #### (我会持续更新,欢迎watch) -## [Android](https://github.com/fanrunqi/ForAndroidInterview/tree/master/android) +## [Android](https://github.com/fanrunqi/ForAndroidInterview/tree/master/android) +--- ##### 基础 -*** + * [全面了解Activity](https://github.com/fanrunqi/ForAndroidInterview/blob/master/android/%E5%85%A8%E9%9D%A2%E4%BA%86%E8%A7%A3Activity.md) @@ -41,7 +42,7 @@ * [Android 名企面试题及答案整理(一)](https://github.com/fanrunqi/ForAndroidInterview/blob/master/android/%5BAndroid%5D%20%E5%90%8D%E4%BC%81%E9%9D%A2%E8%AF%95%E9%A2%98%EF%BC%88%E4%B8%80%EF%BC%89.md) -*** +##### 问题 * [Android5.0、6.0、7.0新特性](https://github.com/fanrunqi/AndroidInterview/blob/master/android/Android5.0%E3%80%816.0%E3%80%817.0%E6%96%B0%E7%89%B9%E6%80%A7.md) @@ -73,18 +74,17 @@ ##### 外链 -*** * [布局性能优化(include, viewstub, merge)](http://www.trinea.cn/android/layout-performance/) * [DOM、SAX、Pull解析XML](http://www.cnblogs.com/xiaoluo501395377/p/3444744.html) - -## [Java](https://github.com/fanrunqi/ForAndroidInterview/tree/master/java) +## [Java](https://github.com/fanrunqi/ForAndroidInterview/tree/master/java) +--- ##### 基础 -*** + * [ArrayList、LinkedList、Vector的区别](https://github.com/fanrunqi/ForAndroidInterview/blob/master/java/%5BJava%5D%20ArrayList%E3%80%81LinkedList%E3%80%81Vector%E7%9A%84%E5%8C%BA%E5%88%AB.md) @@ -145,7 +145,7 @@ * [Java与C++对比](https://github.com/fanrunqi/AndroidInterview/blob/master/java/Java%E4%B8%8EC%2B%2B%E5%AF%B9%E6%AF%94.md) ##### 外链 -*** + * [java反射](http://762626559-qq-com.iteye.com/blog/395402) @@ -162,9 +162,9 @@ ## [数据结构](https://github.com/fanrunqi/ForAndroidInterview/tree/master/data%20structure) - +--- ##### 基础 -*** + * [九大基础排序总结与对比](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20%E4%B9%9D%E5%A4%A7%E5%9F%BA%E7%A1%80%E6%8E%92%E5%BA%8F%E6%80%BB%E7%BB%93%E4%B8%8E%E5%AF%B9%E6%AF%94.md) @@ -191,14 +191,15 @@ * [队列和栈](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20%E9%98%9F%E5%88%97%E5%92%8C%E6%A0%88.md) ##### 外链 -*** + * [海量数据处理 ](http://blog.csdn.net/zyq522376829/article/details/47686867) -## [算法](https://github.com/fanrunqi/ForAndroidInterview/tree/master/algorithm) +## [算法](https://github.com/fanrunqi/ForAndroidInterview/tree/master/algorithm) +--- ##### 基础 -*** + * [二叉搜索树与双向链表](https://github.com/fanrunqi/ForAndroidInterview/blob/master/algorithm/swordForOffer/%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%8E%E5%8F%8C%E5%90%91%E9%93%BE%E8%A1%A8.md) @@ -257,7 +258,7 @@ * [顺时针打印矩阵](https://github.com/fanrunqi/ForAndroidInterview/blob/master/algorithm/swordForOffer/%E9%A1%BA%E6%97%B6%E9%92%88%E6%89%93%E5%8D%B0%E7%9F%A9%E9%98%B5.md) ##### 外链 -*** + * [分治算法](http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741370.html) From 0ce5a492f9f3da630099d9f536e9a740540235fb Mon Sep 17 00:00:00 2001 From: fanrunqi Date: Thu, 23 Jun 2016 17:36:14 +0800 Subject: [PATCH 15/17] =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\345\234\250\350\277\231\351\207\214).md" | 1109 +++++++++++++++++ 1 file changed, 1109 insertions(+) create mode 100644 "android/Android \346\272\220\347\240\201\344\270\255\347\232\204\350\256\276\350\256\241\346\250\241\345\274\217(\344\275\240\351\234\200\350\246\201\347\237\245\351\201\223\347\232\204\350\256\276\350\256\241\346\250\241\345\274\217\345\205\250\345\234\250\350\277\231\351\207\214).md" diff --git "a/android/Android \346\272\220\347\240\201\344\270\255\347\232\204\350\256\276\350\256\241\346\250\241\345\274\217(\344\275\240\351\234\200\350\246\201\347\237\245\351\201\223\347\232\204\350\256\276\350\256\241\346\250\241\345\274\217\345\205\250\345\234\250\350\277\231\351\207\214).md" "b/android/Android \346\272\220\347\240\201\344\270\255\347\232\204\350\256\276\350\256\241\346\250\241\345\274\217(\344\275\240\351\234\200\350\246\201\347\237\245\351\201\223\347\232\204\350\256\276\350\256\241\346\250\241\345\274\217\345\205\250\345\234\250\350\277\231\351\207\214).md" new file mode 100644 index 0000000..c12bddc --- /dev/null +++ "b/android/Android \346\272\220\347\240\201\344\270\255\347\232\204\350\256\276\350\256\241\346\250\241\345\274\217(\344\275\240\351\234\200\350\246\201\347\237\245\351\201\223\347\232\204\350\256\276\350\256\241\346\250\241\345\274\217\345\205\250\345\234\250\350\277\231\351\207\214).md" @@ -0,0 +1,1109 @@ + + +#面向对象的六大原则 + + + - **单一职责原则** + +  所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。通俗的说,即一个类只负责一项职责,将一组相关性很高的函数、数据封装到一个类中。 + + - **开闭原则** + +  对于扩展是开放的,这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。 +  对于修改是关闭的,对模块行为进行扩展时,不必改动模块的源代码。 + +  通俗的说,尽量通过扩展的方式实现系统的升级维护和新功能添加,而不是通过修改已有的源代码。 + + - **里氏替换原则** + +  使用“抽象(Abstraction)”和“多态(Polymorphism)”将设计中的静态结构改为动态结构,维持设计的封闭性。任何基类可以出现的地方,子类一定可以出现。 + +  在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立。在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。 + + - **依赖倒置原则** + +  高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。 +   +  程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合(各个模块之间相互传递的参数声明为抽象类型,而不是声明为具体的实现类)。 + + - **接口隔离原则** + +  一个类对另一个类的依赖应该建立在最小的接口上。其原则是将非常庞大的、臃肿的接口拆分成更小的更具体的接口。 + + - **迪米特原则** + +  又叫作最少知识原则,就是说一个对象应当对其他对象有尽可能少的了解。 +  通俗地讲,一个类应该对自己需要耦合或调用的类知道得最少,不关心被耦合或调用的类的内部实现,只负责调用你提供的方法。 + +  下面开始设计模式学习...   +#1. Singleton(单例模式) + +作用:   +> 保证在Java应用程序中,一个类Class只有一个实例存在。 + +好处: +>由于单例模式在内存中只有一个实例,减少了内存开销。 +> + 单例模式可以避免对资源的多重占用,例如一个写文件时,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作。 +   +>单例模式可以再系统设置全局的访问点,优化和共享资源访问。 + +使用情况: +>建立目录 数据库连接的单线程操作 +> +>某个需要被频繁访问的实例对象  + +##1.1 使用方法 + +**第一种形式:** + +``` +public class Singleton { + + /* 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载 */ + private static Singleton instance = null; + + /* 私有构造方法,防止被实例化 */ + private Singleton() { + } + + /* 懒汉式:第一次调用时初始Singleton,以后就不用再生成了 + 静态方法,创建实例 */ + public static Singleton getInstance() { + if (instance == null) { + instance = new Singleton(); + } + return instance; + } +} +``` +  但是这有一个问题,不同步啊!在对据库对象进行的频繁读写操作时,不同步问题就大了。 + +**第二种形式**: + +  既然不同步那就给getInstance方法加个锁呗!我们知道使用synchronized关键字可以同步方法和同步代码块,所以:   + +``` + public static synchronized Singleton getInstance() { + if (instance == null) { + instance = new Singleton(); + } + return instance; + } +``` +或是 + +``` +public static Singleton getInstance() { + synchronized (Singleton.class) { + if (instance == null) { + instance = new Singleton(); + } + } + return instance; + } +``` + +获取Singleton实例: + +``` +Singleton.getInstance().方法() +``` +##1.2android中的Singleton + +> 软键盘管理的 InputMethodManager + +源码(以下的源码都是5.1的): +``` +205 public final class InputMethodManager { +//......... +211 static InputMethodManager sInstance; +//......... +619 public static InputMethodManager getInstance() { +620 synchronized (InputMethodManager.class) { +621 if (sInstance == null) { +622 IBinder b = ServiceManager.getService(Context.INPUT_METHOD_SERVICE); +623 IInputMethodManager service = IInputMethodManager.Stub.asInterface(b); +624 sInstance = new InputMethodManager(service, Looper.getMainLooper()); +625 } +626 return sInstance; +627 } +628 } +``` + +  使用的是第二种同步代码块的单例模式(可能涉及到多线程),类似的还有 +  AccessibilityManager(View获得点击、焦点、文字改变等事件的分发管理,对整个系统的调试、问题定位等) +  BluetoothOppManager等。 + +当然也有同步方法的单例实现,比如:CalendarDatabaseHelper + +``` +307 public static synchronized CalendarDatabaseHelper getInstance(Context context) { +308 if (sSingleton == null) { +309 sSingleton = new CalendarDatabaseHelper(context); +310 } +311 return sSingleton; +312 } +``` + +**注意Application并不算是单例模式** + +``` +44 public class Application extends ContextWrapper implements ComponentCallbacks2 { + +79 public Application() { +80 super(null); +81 } +``` +在Application源码中,其构造方法是公有的,意味着可以生出多个Application实例,但为什么Application能实现一个app只存在一个实例呢?请看下面: + +在ContextWrapper源码中: + +``` +50 public class ContextWrapper extends Context { +51 Context mBase; +52 +53 public ContextWrapper(Context base) { +54 mBase = base; +55 } + +64 protected void attachBaseContext(Context base) { +65 if (mBase != null) { +66 throw new IllegalStateException("Base context already set"); +67 } +68 mBase = base; +69 } +``` +ContextWrapper构造函数传入的base为null, 就算有多个Application实例,但是没有通过attach()绑定相关信息,没有上下文环境,三个字。 + + **然并卵** + + +#2. Factory(工厂模式) + +> 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 + **对同一个接口的实现类进行管理和实例化创建** + +![这里写图片描述](http://img.blog.csdn.net/20160620135007144)  + +假设我们有这样一个需求: + +  动物Animal,它有行为move()。有两个实现类cat和dog。为了统一管理和创建我们设计一个工厂模式。 +  同时两个子类有各自的行为,Cat有eatFish(),Dog有eatBone(). + +结构图: +![这里写图片描述](http://img.blog.csdn.net/20160620141023393) + +Animal接口: + +``` +interface animal { + void move(); +} +``` +Cat类: + +``` +public class Cat implements Animal{ + + @Override + public void move() { + // TODO Auto-generated method stub + System.out.println("我是只肥猫,不爱动"); + } + public void eatFish() { + System.out.println("爱吃鱼"); + } +} +``` +Dog类: + +``` +public class Dog implements Animal{ + + @Override + public void move() { + // TODO Auto-generated method stub + System.out.println("我是狗,跑的快"); + } + public void eatBone() { + System.out.println("爱吃骨头"); + } +} +``` +那么现在就可以建一个工厂类(Factory.java)来对实例类进行管理和创建了. + +``` +public class Factory { + //静态工厂方法 + //多处调用,不需要实例工厂类 + public static Cat produceCat() { + return new Cat(); + } + public static Dog produceDog() { + return new Dog(); + } +//当然也可以一个方法,通过传入参数,switch实现 +} +``` +使用: + +``` +Animal cat = Factory.produceCat(); +cat.move(); +//----------------------------- +Dog dog = Factory.produceDog(); +dog.move(); +dog.eatBone(); +``` +  工厂模式在业界运用十分广泛,如果都用new来生成对象,随着项目的扩展,animal还可以生出许多其他儿子来,当然儿子还有儿子,同时也避免不了对以前代码的修改(比如加入后来生出儿子的实例),怎么管理,想着就是一团糟。 + +``` +Animal cat = Factory.produceCat(); +``` +  这里实例化了Animal但不涉及到Animal的具体子类(减少了它们之间的偶合联系性),达到封装效果,也就减少错误修改的机会。 + +  Java面向对象的原则,封装(Encapsulation)和分派(Delegation)告诉我们:**具体事情做得越多,越容易范错误,** + +  一般来说,这样的普通工厂就可以满足基本需求。但是我们如果要新增一个Animal的实现类panda,那么必然要在工厂类里新增了一个生产panda的方法。就违背了 闭包的设计原则(对扩展要开放对修改要关闭) ,于是有了抽象工厂模式。 + +##2.1 Abstract Factory(抽象工厂) + +  抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 +  啥意思?就是把**生产抽象成一个接口,每个实例类都对应一个工厂类**(普通工厂只有一个工厂类),**同时所有工厂类都继承这个生产接口**。 + +生产接口Provider: + +``` +interface Provider { + Animal produce(); +} +``` +每个产品都有自己的工厂 +CatFactory: + +``` +public class CatFactory implements Provider{ + + @Override + public Animal produce() { + // TODO Auto-generated method stub + return new Cat(); + } +} +``` +DogFactory: + +``` +public class DogFactory implements Provider{ + + @Override + public Animal produce() { + // TODO Auto-generated method stub + return new Dog(); + } +} +``` +产品生产: + +``` +Provider provider = new CatFactory(); +Animal cat =provider.produce(); +cat.move(); +``` +  现在我们要加入panda,直接新建一个pandaFactory就行了,这样我们系统就非常灵活,具备了动态扩展功能。 + +##2.1 Android中的Factory + +  比如AsyncTask的抽象工厂实现: + +工厂的抽象: + +``` +59 public interface ThreadFactory { +//省略为备注 +69 Thread newThread(Runnable r); +70 } +``` +产品的抽象(new Runnable就是其实现类): + +``` +56 public interface Runnable { +//省略为备注 +68 public abstract void run(); +69 } +``` +AsyncTask中工厂类的实现: +``` +185 private static final ThreadFactory sThreadFactory = new ThreadFactory() { +186 private final AtomicInteger mCount = new AtomicInteger(1); +187 +188 public Thread newThread(Runnable r) { +189 return new Thread(r, "AsyncTask #" + mCount.getAndIncrement()); +190 } +191 }; +``` + 我们可以创建另外类似的工厂,生产某种专门的线程(多线程),非常容易扩展。 +当然,android中的应用还有很多(比如BitmapFactory),有兴趣的小伙伴可以去扒一扒。 + +#3. Adapter(适配器模式) + +**将一个类的接口转换成客户希望的另外一个接口**。 + +  我们经常碰到要将两个没有关系的类组合在一起使用,第一解决方案是:修改各自类的接口,但是如果我们没有源代码,或者,我们不愿意为了一个应用而修改各自的接口。 怎么办? + +使用Adapter,在这两种接口之间创建一个混合接口。 + +> 模式中的角色 + +>需要适配的类(Adaptee):需要适配的类。 + +>适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。 + +>目标接口(Target):客户所期待的接口。可以是**具体的或抽象的类,也可以是接口。** + +![这里写图片描述](http://img.blog.csdn.net/20160620135007144)  +``` +// 需要适配的类 +class Adaptee { + public void specificRequest() { + System.out.println("需要适配的类"); + } +} + +// 目标接口 +interface Target { + public void request(); +} +``` + +实现方式: + +①、对象适配器(采用对象组合方式实现) + +``` +// 适配器类实现标准接口 +class Adapter implements Target{ + // 直接关联被适配类 + private Adaptee adaptee; + + // 可以通过构造函数传入具体需要适配的被适配类对象 + public Adapter (Adaptee adaptee) { + this.adaptee = adaptee; + } + + public void request() { + // 这里是使用委托的方式完成特殊功能 + this.adaptee.specificRequest(); + } +} + +// 测试类 +public class Client { + public static void main(String[] args) { + // 需要先创建一个被适配类的对象作为参数 + Target adapter = new Adapter(new Adaptee()); + adapter.request(); + } +} +``` +  如果Target不是接口而是一个具体的类的情况,这里的Adapter直接继承Target就可以了。 + +②、类的适配器模式(采用继承实现) + +``` +// 适配器类继承了被适配类同时实现标准接口 +class Adapter extends Adaptee implements Target{ + public void request() { + super.specificRequest(); + } +} + +// 测试类 + public static void main(String[] args) { + // 使用适配类 + Target adapter = new Adapter(); + adapter.request(); + } +``` +  如果Target和 Adaptee都是接口,并且都有实现类。 可以通过Adapter实现两个接口来完成适配。 +  还有一种叫PluggableAdapters,可以动态的获取几个adapters中一个。使用Reflection技术,可以动态的发现类中的Public方法。 + +> 优点 + +  系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到**更好的复用**。 +  将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码,**更好的扩展性**。 + +> 缺点 + +  过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是A接口,其实内部被适配成了B接口的实现。如果不是必要,不要使用适配器,而是直接对系统进行重构。 + +##3.1 Android中的Adapter + +  android中的Adapter就有很多了,这个大家都经常用。 +  Adapter是AdapterView视图与数据之间的桥梁,Adapter提供对数据的访问,也负责为每一项数据产生一个对应的View。 + +> Adapter的继承结构 + +![这里写图片描述](http://img.blog.csdn.net/20160621094155219) + +BaseAdapter的部分源码: +``` +30public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter { +31 private final DataSetObservable mDataSetObservable = new DataSetObservable(); +32 +33 public boolean hasStableIds() { +34 return false; +35 } +36 +37 public void registerDataSetObserver(DataSetObserver observer) { +38 mDataSetObservable.registerObserver(observer); +39 } +40 +41 public void unregisterDataSetObserver(DataSetObserver observer) { +42 mDataSetObservable.unregisterObserver(observer); +43 } +``` +ListAdapter, SpinnerAdapter都是Target ,数据是Adaptee ,采用对象组合方式。 + +#4. Chain of Responsibility(责任链模式) + +  使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 +   +  发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。  + +编程中的小体现: + +``` +if(a<10){ + ... +} +else if (a<20){ + ... +} +else if(a<30){ + ... +} +else{ + ... +} +``` +程序必须依次扫描每个分支进行判断,找到对应的分支进行处理。 + +> 责任链模式的优点 + +  可以降低系统的耦合度(请求者与处理者代码分离),简化对象的相互连接,同时增强给对象指派职责的灵活性,增加新的请求处理类也很方便; + +> 责任链模式的缺点 + +   不能保证请求一定被接收,且对于比较长的职责链,请求的处理可能涉及到多个处理对象,系统性能将受到一定影响,而且在进行代码调试时不太方便。 +  每次都是从链头开始,这也正是链表的缺点。 +   +##4.1 Android中的Chain of Responsibility + +  触摸、按键等各种事件的传递 +   +![这里写图片描述](http://img.blog.csdn.net/20160621101505594) + +有兴趣的可以看一下这篇文章[View事件分发机制源码分析](http://blog.csdn.net/Amazing7/article/details/51274481),我这就不多说了。 + +#5. Observer(观察者模式) + +  有时被称作发布/订阅模式,观察者模式定义了一种**一对多**的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 + +  将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的(依赖关系并未完全解除,抽象通知者依旧依赖抽象的观察者。)。 + +> 观察者模式的组成 + +①抽象主题(Subject) + +  它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。 + +②具体主题(ConcreteSubject) + +  将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。 + +③抽象观察者(Observer) + +  为所有的具体观察者定义一个接口,在得到主题通知时更新自己。 + +④具体观察者(ConcreteObserver) + +  实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。 + +![这里写图片描述](http://img.blog.csdn.net/20160621104419553)  + +言语苍白,上代码: + +``` +//抽象观察者 +public interface Observer +{ + public void update(String str); + +} +``` + +``` +//具体观察者 +public class ConcreteObserver implements Observer{ + @Override + public void update(String str) { + // TODO Auto-generated method stub + System.out.println(str); + } +} +``` + +``` +//抽象主题 +public interface Subject +{ + public void addObserver(Observer observer); + public void removeObserver(Observer observer); + public void notifyObservers(String str); +} +``` + +``` +//具体主题 +public class ConcreteSubject implements Subject{ + // 存放观察者 + private List list = new ArrayList(); + @Override + public void addObserver(Observer observer) { + // TODO Auto-generated method stub + list.add(observer); + } + + @Override + public void removeObserver(Observer observer) { + // TODO Auto-generated method stub + list.remove(observer); + } + + @Override + public void notifyObservers(String str) { + // TODO Auto-generated method stub + for(Observer observer:list){ + observer.update(str); + } + } +} +``` +下面是测试类: + +``` +/** + * @author fanrunqi + */ +public class Test { + public static void main(String[] args) { + //一个主题 + ConcreteSubject eatSubject = new ConcreteSubject(); + //两个观察者 + ConcreteObserver personOne = new ConcreteObserver(); + ConcreteObserver personTwo = new ConcreteObserver(); + //观察者订阅主题 + eatSubject.addObserver(personOne); + eatSubject.addObserver(personTwo); + + //通知开饭了 + eatSubject.notifyObservers("开饭啦"); + } +} +``` + +> “关于代码你有什么想说的?” +>“没有,都在代码里了” +>“(⊙o⊙)哦.....” + +##5.1 Android中的Observer + +  观察者模式在android中运用的也比较多,最熟悉的ContentObserver。 + +① 抽象类ContentResolver中(Subject) + +注册观察者: + +``` +1567 public final void registerContentObserver(Uri uri, boolean notifyForDescendents, +1568 ContentObserver observer, int userHandle) + +``` +取消观察者: + +``` +1583 public final void unregisterContentObserver(ContentObserver observer) +``` +抽象类ContentObserver中(Observer) + +``` +94 public void onChange(boolean selfChange) { +95 // Do nothing. Subclass should override. +96 } + +144 public void onChange(boolean selfChange, Uri uri, int userId) { +145 onChange(selfChange, uri); +146 } + +129 public void onChange(boolean selfChange, Uri uri) { +130 onChange(selfChange); +131 } +``` +  观察特定Uri引起的数据库的变化,继而做一些相应的处理(最终都调用的第一个函数). + +② DataSetObserver,其实这个我们一直在用,只是没意识到。 + +我们再看到BaseAdapter的部分源码: + +``` +37 public void registerDataSetObserver(DataSetObserver observer) { +38 mDataSetObservable.registerObserver(observer); +39 } +40 +41 public void unregisterDataSetObserver(DataSetObserver observer) { +42 mDataSetObservable.unregisterObserver(observer); +43 } + +``` + 上面两个方法分别向向BaseAdater注册、注销一个DataSetObserver实例。 + +DataSetObserver 的源码: +``` +24 public abstract class DataSetObserver { + +29 public void onChanged() { +30 // Do nothing +31 } + +38 public void onInvalidated() { +39 // Do nothing +40 } +41} +``` +  DataSetObserver就是一个观察者,它一旦发现BaseAdapter内部数据有变量,就会通过回调方法DataSetObserver.onChanged和DataSetObserver.onInvalidated来通知DataSetObserver的实现类。 + +#6. Builder(建造者模式) +   +  建造者模式:是将一个复杂的对象的构建与它的表示分离(同构建不同表示),使得同样的构建过程可以创建不同的表示。 + +>   一个人活到70岁以上,都会经历这样的几个阶段:婴儿,少年,青年,中年,老年。并且每个人在各个阶段肯定是不一样的,世界上不存在两个人在人生的这5个阶段的生活完全一样,但是活到70岁以上的人,都经历了这几个阶段是肯定的。实际上这是一个比较经典的建造者模式的例子了。 + +  将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心。 + +建造者模式通常包括下面几个角色: + +① Builder:一个抽象接口,用来规范产品对象的各个组成成分的建造。 + +② ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建,在建造过程完成后,提供产品的实例。 + +③ Director:指导者,调用具体建造者来创建复杂对象的各个部分,不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。 + +④ Product:要创建的复杂对象。 + +> 与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指导者联系建造者最后得到产品。即建造模式可以强制实行一种分步骤进行的建造过程。 + +![这里写图片描述](http://img.blog.csdn.net/20160621134142566)  + + +Product和产品的部分Part接口 +``` + public interface Product { } + public interface Part { } +``` + +Builder: + +``` + public interface Builder { +    void buildPartOne(); +    void buildPartTwo(); +   +    Product getProduct(); +  } +``` +ConcreteBuilder: + +``` +//具体建造工具 +  public class ConcreteBuilder implements Builder { +    Part partOne, partTwo; + +    public void buildPartOne() { +      //具体构建代码 +    }; +    public void buildPartTwo() { +      //具体构建代码 +    }; +     public Product getProduct() { +      //返回最后组装的产品 +    }; +  } +``` +Director : + +``` + public class Director { +    private Builder builder; +   +    public Director( Builder builder ) { +      this.builder = builder; +    } +    public void construct() { +      builder.buildPartOne(); +      builder.buildPartTwo(); +    } +  } + +``` +建造: + +``` +ConcreteBuilder builder = new ConcreteBuilder(); +Director director = new Director(builder); +//开始各部分建造  +director.construct(); +Product product = builder.getResult(); +``` + +> 优点: + +客户端不必知道产品内部组成的细节。 + +具体的建造者类之间是相互独立的,对系统的扩展非常有利。 + +由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。 + +> 使用场合: + +创建一些复杂的对象时,这些对象的内部组成构件间的建造**顺序是稳定**的,但是对象的内**部组成构件面临着复杂的变化**。 + +要创建的复杂对象的算法,独立于该对象的组成部分,也独立于组成部分的装配方法时。 + +##6.1 Android中的Builder + + android中的Dialog就使用了Builder Pattern,下面来看看AlertDialog的部分源码。 + +``` +371 public static class Builder { +372 private final AlertController.AlertParams P; +373 private int mTheme; + +393 public Builder(Context context, int theme) { +394 P = new AlertController.AlertParams(new ContextThemeWrapper( +395 context, resolveDialogTheme(context, theme))); +396 mTheme = theme; +397 } +``` +  AlertDialog的Builder 是一个静态内部类,没有定义Builder 的抽象接口。 +  对AlertDialog设置的属性会保存在Build类的成员变量P(AlertController.AlertParams)中。 + +Builder类中部分方法: + +``` +416 public Builder setTitle(int titleId) { +417 P.mTitle = P.mContext.getText(titleId); +418 return this; +419 } +``` + +``` +452 public Builder setMessage(int messageId) { +453 P.mMessage = P.mContext.getText(messageId); +454 return this; +455 } + +``` + +``` +525 public Builder setPositiveButton(CharSequence text, final OnClickListener listener) { +526 P.mPositiveButtonText = text; +527 P.mPositiveButtonListener = listener; +528 return this; +529 } +``` +而show()方法会返回一个结合上面设置的dialog实例 + +``` +991 public AlertDialog show() { +992 AlertDialog dialog = create(); +993 dialog.show(); +994 return dialog; +995 } +996 } +997 +998} +``` + +``` +972 public AlertDialog create() { +973 final AlertDialog dialog = new AlertDialog(P.mContext, mTheme, false); +974 P.apply(dialog.mAlert); +975 dialog.setCancelable(P.mCancelable); +976 if (P.mCancelable) { +977 dialog.setCanceledOnTouchOutside(true); +978 } +979 dialog.setOnCancelListener(P.mOnCancelListener); +980 dialog.setOnDismissListener(P.mOnDismissListener); +981 if (P.mOnKeyListener != null) { +982 dialog.setOnKeyListener(P.mOnKeyListener); +983 } +984 return dialog; +985 } +``` + +简单建造: + +``` +new AlertDialog.Builder(context) + .setTitle("标题") + .setMessage("消息框") + .setPositiveButton("确定", null) + .show(); +``` +#7. Memento(备忘录模式) + +  备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式。 + +  备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。备忘录模式常常与命令模式和迭代子模式一同使用。 + +备忘录模式所涉及的角色有三个: + +① Originator(发起人): 负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态。Originator可根据需要决定Memento存储Originator的哪些内部状态。  + +② Memento(备忘录): 负责存储Originnator对象的内部状态,并可防止Originator以外的其他对象访问备忘录Memento,备忘录有两个接口,Caretaker只能看到备忘录的窄接口,它只能将备忘录传递给其他对象。 + +③、 Caretaker(管理者):负责保存好备忘录Memento,不能对备忘录的内容进行操作或检查。 + + ![这里写图片描述](http://img.blog.csdn.net/20160621134142566)  + +``` +public class Originator { + + private String state; + /** + * 工厂方法,返回一个新的备忘录对象 + */ + public Memento createMemento(){ + return new Memento(state); + } + /** + * 将发起人恢复到备忘录对象所记载的状态 + */ + public void restoreMemento(Memento memento){ + this.state = memento.getState(); + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + System.out.println("当前状态:" + this.state); + } + +} +``` + +``` +public class Memento { + + private String state; + + public Memento(String state){ + this.state = state; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + +} +``` + +``` +public class Caretaker { + + private Memento memento; + /** + * 备忘录的取值方法 + */ + public Memento retrieveMemento(){ + return this.memento; + } + /** + * 备忘录的赋值方法 + */ + public void saveMemento(Memento memento){ + this.memento = memento; + } +} +``` + +使用: + +``` +Originator o = new Originator(); +Caretaker c = new Caretaker(); +//改变负责人对象的状态 +o.setState("On"); +//创建备忘录对象,并将发起人对象的状态储存起来 + c.saveMemento(o.createMemento()); +//修改发起人的状态 +o.setState("Off"); +//恢复发起人对象的状态 + o.restoreMemento(c.retrieveMemento()); +``` +不需要了解对象的内部结构的情况下备份对象的状态,方便以后恢复。 + +##7.1 Android中的Memento + +  Activity的onSaveInstanceState和onRestoreInstanceState就是通过Bundle(相当于备忘录对象)这种序列化的数据结构来存储Activity的状态,至于其中存储的数据结构,这两个方法不用关心。 + +还是看一下源码: + +``` +1365 protected void onSaveInstanceState(Bundle outState) { +1366 outState.putBundle(WINDOW_HIERARCHY_TAG, mWindow.saveHierarchyState()); +1367 Parcelable p = mFragments.saveAllState(); +1368 if (p != null) { +1369 outState.putParcelable(FRAGMENTS_TAG, p); +1370 } +1371 getApplication().dispatchActivitySaveInstanceState(this, outState); +1372 } +``` + +``` +1019 protected void onRestoreInstanceState(Bundle savedInstanceState) { +1020 if (mWindow != null) { +1021 Bundle windowState = savedInstanceState.getBundle(WINDOW_HIERARCHY_TAG); +1022 if (windowState != null) { +1023 mWindow.restoreHierarchyState(windowState); +1024 } +1025 } +1026 } +``` +##8. Prototype(原型模式) + +  原型模式,能快速克隆出一个与已经存在对象类似的另外一个我们想要的新对象。 +  工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。 + +  分为深拷贝和浅拷贝。深拷贝就是把对象里面的引用的对象也要拷贝一份新的对象,并将这个新的引用对象作为拷贝的对象引用(多读两遍)。 + + 一般使用原型模式有个明显的特点,就是实现cloneable的clone()方法。 + +在Intent源码中: +``` +4084 @Override +4085 public Object clone() { +4086 return new Intent(this); +4087 } +``` +这里Intent通过实现Cloneable接口来实现原型拷贝。 + +##9. Strategy(策略模式) +   +  定义:有一系列的算法,将每个算法封装起来(每个算法可以封装到不同的类中),各个算法之间可以替换,策略模式让算法独立于使用它的客户而独立变化。 + +  举例: +  一个影碟机,你往里面插什么碟子,就能放出什么电影。 +  属性动画,设置不同的插值器对象,就可以得到不同的变化曲线。 +  返回值解析,传入什么样的解析器,就可以把二进制数据转换成什么格式的数据,比如String、Json、XML。 + +  策略模式其实就是多态的一个淋漓精致的体现。 + +在android中不同Animation动画的实现,主要是依靠Interpolator的不同而实现的。 + +``` +401 public void setInterpolator(Interpolator i) { +402 mInterpolator = i; +403 } +``` +##10. Template(模板模式) + +   定义:定义一个操作中的算法框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定的步骤。 +    +   **实现流程已经确定,实现细节由子类完成**。 +    +   生命周期对于我们都不陌生,它就是典型的Template模式,在具体流程确定的情况下,至于我们要复写生命周期那些方法,实现那些功能由继承activity的子类去具体实现。 + +   关键在于必须有具体的执行流程,比如AsyncTask。 + +##11. Proxy(代理模式) + +  定义:为其他对象提供一种代理以控制对这个对象的访问。 +  代理: 在出发点到目的地之间有一道中间层。 + + 应用:Android跨进程通信方式 ,建议去了解一下Binder机制。 + +##12. Interpreter(解释器模式) + +  定义语言的文法,并且建立一个解释器来解释该语言中的句子。 + +比如Android中通过PackageManagerService来解析AndroidManifest.xml中定义的Activity、service等属性。 + +##13. State(状态模式) + +  行为是由状态来决定的,不同状态下有不同行为。 + +  注意:状态模式的行为是平行的、不可替换的,策略模式的行为是彼此独立可相互替换的。 + +  体现:不同的状态执行不同的行为,当WIFI开启时,自动扫描周围的接入点,然后以列表的形式展示;当wifi关闭时则清空。 + +##14. Command(命令模式) + +  我们有很多命令,把它们放在一个下拉菜单中,用户通过先选择菜单再选择具体命令,这就是Command模式。 + +  本来用户(调用者)是直接调用这些命令的,在菜单上打开文档,就直接指向打开文档的代码,使用Command模式,就是在这两者之间增加一个中间者,将这种直接关系拗断,同时两者之间都隔离,基本没有关系了。 +   +  显然这样做的好处是符合封装的特性,降低耦合度,有利于代码的健壮性 可维护性 还有复用性。Command是将对行为进行封装的典型模式,Factory是将创建进行封装的模式。 + +  android底层逻辑对事件的转发处理就用到了Command模式。 + +##15. Iterator(迭代模式) + +  提供一种方法顺序访问一个容器对象中的各个元素,而不需要暴露该对象的内部表示。 + +应用: + +在Java中的Iterator类。 + + Android中的 Cursor。 + +``` +cursor.moveToFirst(); +``` + +##16. Composite(组合模式)   + +   将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。 + +  Android中View的结构是树形结构,每个ViewGroup包含一系列的View,而ViewGroup本身又是View。这是Android中非常典型的组合模式。 +   +##17. Flyweight(共享模式/享元模式)  + +  定义:避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类)。 + +  面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可能显得很庞大,比如,字处理软件,如果以每个文字都作为一个对象,几千个字,对象数就是几千,无疑耗费内存,那么我们还是要"求同存异",找出这些对象群的共同点,设计一个元类,封装可以被共享的类,另外,还有一些特性是取决于应用(context),是不可共享的,这也Flyweight中两个重要概念内部状态intrinsic和外部状态extrinsic之分。 + +说白点,就是先捏一个的原始模型,然后随着不同场合和环境,再产生各具特征的具体模型,很显然,在这里需要产生不同的新对象,所以Flyweight模式中常出现Factory模式。Flyweight的内部状态是用来共享的,Flyweight factory负责维护一个Flyweight pool(模式池)来存放内部状态的对象。 + +Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度。应用场合很多:比如你要从一个数据库中读取一系列字符串,这些字符串中有许多是重复的,那么我们可以将这些字符串储存在Flyweight池(pool)中。 + + +  在Android线程通信中,每次获取Message时调Message.obtain()其实就是从消息池中取出可重复使用的消息,避免产生大量的Message对象。 +   +##最后 + +> 那么问题来了,什么是设计模式? + + +![这里写图片描述](http://img.blog.csdn.net/20160621150602180) + +> 设计模式是前辈、大牛在实际编程中对遇到的问题解决方案的抽象。 From 8c5e6595e3a3f40657427c48439efee16d6caa06 Mon Sep 17 00:00:00 2001 From: fanrunqi Date: Thu, 23 Jun 2016 17:38:23 +0800 Subject: [PATCH 16/17] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 64abb0d..a2b0bf8 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ --- ##### 基础 +* [Android 源码中的设计模式(你需要知道的设计模式全在这里)](https://github.com/fanrunqi/AndroidInterview/blob/master/android/Android%20%E6%BA%90%E7%A0%81%E4%B8%AD%E7%9A%84%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F(%E4%BD%A0%E9%9C%80%E8%A6%81%E7%9F%A5%E9%81%93%E7%9A%84%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E5%85%A8%E5%9C%A8%E8%BF%99%E9%87%8C).md) * [全面了解Activity](https://github.com/fanrunqi/ForAndroidInterview/blob/master/android/%E5%85%A8%E9%9D%A2%E4%BA%86%E8%A7%A3Activity.md) @@ -166,7 +167,7 @@ ##### 基础 -* [九大基础排序总结与对比](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20%E4%B9%9D%E5%A4%A7%E5%9F%BA%E7%A1%80%E6%8E%92%E5%BA%8F%E6%80%BB%E7%BB%93%E4%B8%8E%E5%AF%B9%E6%AF%94.md) +* [九大基础排序总结与对比(排序算法一网打尽)](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20%E4%B9%9D%E5%A4%A7%E5%9F%BA%E7%A1%80%E6%8E%92%E5%BA%8F%E6%80%BB%E7%BB%93%E4%B8%8E%E5%AF%B9%E6%AF%94.md) * [AVL树和AVL旋转、哈夫曼树和哈夫曼编码](https://github.com/fanrunqi/ForAndroidInterview/blob/master/data%20structure/%5B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%5D%20AVL%E6%A0%91%E5%92%8CAVL%E6%97%8B%E8%BD%AC%E3%80%81%E5%93%88%E5%A4%AB%E6%9B%BC%E6%A0%91%E5%92%8C%E5%93%88%E5%A4%AB%E6%9B%BC%E7%BC%96%E7%A0%81.md) From b1d70e816c265fbf358061f0a501dc2c675b064b Mon Sep 17 00:00:00 2001 From: fanrunqi Date: Thu, 23 Jun 2016 17:59:44 +0800 Subject: [PATCH 17/17] Update README.md --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index a2b0bf8..b48dec1 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,15 @@ ## Android 名企面试题及涉及知识点整理。 #### (我会持续更新,欢迎watch) +## 面经与准备 +--- +* [我面试到底问什么?](https://zhuanlan.zhihu.com/p/21343656) + +* [如何做好面试题目准备,将面试成功率提高80%](http://toutiao.com/a6284700037164204289/) + +* [面试最经典的九大问题,教你答好变“面霸”!](http://toutiao.com/a6289172490736943361/?tt_from=mobile_qq&utm_campaign=client_share&app=news_article&utm_source=mobile_qq&iid=4448123433&utm_medium=toutiao_android) + +* [面试前15个你最需要准备的问题,以及面试官背后隐藏的意思](http://toutiao.com/a6295298465253916929/) ## [Android](https://github.com/fanrunqi/ForAndroidInterview/tree/master/android) ---