Skip to content

Commit 105b970

Browse files
author
卫清才
committed
Merge remote-tracking branch 'refs/remotes/GeniusVJR/master'
2 parents 16332b4 + 1170fc2 commit 105b970

21 files changed

+1310
-255
lines changed

Part1/Android/Android内存泄漏总结.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ Java 程序运行时的内存分配策略有三种,分别是静态分配,栈式
1111

1212
* 静态存储区(方法区):主要存放静态数据、全局 static 数据和常量。这块内存在程序编译时就已经分配好,并且在程序整个运行期间都存在。
1313

14-
* 栈区 :当方法被执行时,方法体内的局部变量都在栈上创建,并在方法执行结束时这些局部变量所持有的内存将会自动被释放。因为栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
14+
* 栈区 :当方法被执行时,方法体内的局部变量(其中包括基础数据类型、对象的引用)都在栈上创建,并在方法执行结束时这些局部变量所持有的内存将会自动被释放。因为栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
1515

16-
* 堆区 : 又称动态内存分配,通常就是指在程序运行时直接 new 出来的内存。这部分内存在不使用时将会由 Java 垃圾回收器来负责回收。
16+
* 堆区 : 又称动态内存分配,通常就是指在程序运行时直接 new 出来的内存,也就是对象的实例。这部分内存在不使用时将会由 Java 垃圾回收器来负责回收。
1717

1818
##栈与堆的区别:
1919

@@ -24,7 +24,7 @@ Java 程序运行时的内存分配策略有三种,分别是静态分配,栈式
2424
举个例子:
2525

2626
```
27-
public class Sample() {
27+
public class Sample {
2828
int s1 = 0;
2929
Sample mSample1 = new Sample();
3030
@@ -97,7 +97,7 @@ for (int i = 1; i < 100; i++) {
9797

9898
2.Java内存泄漏引起的原因
9999

100-
内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。内存泄露有时不严重且不易察觉,这样开发者就不知道存在内存泄露,但有时也会很严重,会提示你Out of memory。
100+
内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。内存泄露有时不严重且不易察觉,这样开发者就不知道存在内存泄露,但有时也会很严重,会提示你Out of memory。j
101101

102102
Java内存泄漏的根本原因是什么呢?长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏,尽管短生命周期对象已经不再需要,但是因为长生命周期持有它的引用而导致不能被回收,这就是Java中内存泄漏的发生场景。具体主要有如下几大类:
103103

Part1/Android/Android基础知识.md

Lines changed: 65 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,14 @@
2323
这个布局也是相对自由的布局,Android 对该布局的child view的 水平layout& 垂直layout做了解析,由此我们可以FrameLayout的基础上使用标签或者Java代码对垂直方向 以及 水平方向 布局中的views任意的控制.
2424

2525
* 相关属性:
26-
  ``android:layout_centerInParent="true|false"``
27-
  ``android:layout_centerHorizontal="true|false"``
28-
  ``android:layout_alignParentRight="true|false"``
29-
...
26+
27+
```
28+
29+
  android:layout_centerInParent="true|false"
30+
  android:layout_centerHorizontal="true|false"
31+
  android:layout_alignParentRight="true|false"
32+
  
33+
```
3034
3135
* TableLayout(表格布局)
3236
@@ -47,8 +51,8 @@
4751
onRestart()—>**onStart()**—>onResume(),再次回到运行状态。
4852
* Activity退居后台,且系统内存不足,
4953
系统会杀死这个后台状态的Activity(此时这个Activity引用仍然处在任务栈中,只是这个时候引用指向的对象已经为null),若再次回到这个Activity,则会走onCreate()–>onStart()—>onResume()(将重新走一次Activity的初始化生命周期)
50-
* 锁定屏与解锁屏幕
51-
**只会调用onPause(),而不会调用onStop()方法,开屏后则调用onResume()**
54+
* 锁屏:`onPause()->onStop()`
55+
* 解锁:`onStart()->onResume()`
5256
5357
* 更多流程分支,请参照以下生命周期流程图
5458
![](http://img.blog.csdn.net/20130828141902812)
@@ -75,11 +79,11 @@ Activity的堆栈管理以ActivityRecord为单位,所有的ActivityRecord都放
7579
**Activity缓存方法。**
7680
7781
有a、b两个Activity,当从a进入b之后一段时间,可能系统会把a回收,这时候按back,执行的不是a的onRestart而是onCreate方法,a被重新创建一次,这是a中的临时数据和状态可能就丢失了。
78-
可以用Activity中的onSaveInstanceState()回调方法保存临时数据和状态,这个方法一定会在活动被回收之前调用。
79-
方法中有一个Bundle参数,putString()、putInt()等方法需要传入两个参数,一个键一个值。
80-
数据保存之后会在onCreate中恢复,onCreate也有一个Bundle类型的参数
82+
83+
可以用Activity中的onSaveInstanceState()回调方法保存临时数据和状态,这个方法一定会在活动被回收之前调用。方法中有一个Bundle参数,putString()、putInt()等方法需要传入两个参数,一个键一个值。数据保存之后会在onCreate中恢复,onCreate也有一个Bundle类型的参数。
8184
8285
示例代码:
86+
8387
```
8488
@Override
8589
protected void onCreate(Bundle savedInstanceState) {
@@ -104,14 +108,13 @@ Activity的堆栈管理以ActivityRecord为单位,所有的ActivityRecord都放
104108
```
105109
106110
一、onSaveInstanceState (Bundle outState)
107-
108-
先看Application Fundamentals上的一段话:
109-
Android calls onSaveInstanceState() before the activity becomes vulnerable to being destroyed by the system, but does not bother calling it when the instance is actually being destroyed by a user action (such as pressing the BACK key)
110-
111-
从这句话可以知道,当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState就会被执行,除非该activity是被用户主动销毁的,例如当用户按BACK键的时候。
111+
112+
当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState就会被执行,除非该activity是被用户主动销毁的,例如当用户按BACK键的时候。
113+
112114
注意上面的双引号,何为“容易”?言下之意就是该activity还没有被销毁,而仅仅是一种可能性。这种可能性有哪些?通过重写一个activity的所有生命周期的onXXX方法,包括onSaveInstanceState和onRestoreInstanceState方法,我们可以清楚地知道当某个activity(假定为activity A)显示在当前task的最上层时,其onSaveInstanceState方法会在什么时候被执行,有这么几种情况:
113115
114116
1、当用户按下HOME键时。
117+
115118
这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则
116119
117120
2、长按HOME键,选择运行其他的程序时。
@@ -144,6 +147,7 @@ onRestoreInstanceState被调用的前提是,activity A“确实”被系统销
144147
另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原。
145148
还有onRestoreInstanceState在onstart之后执行。
146149
至于这两个函数的使用,给出示范代码(留意自定义代码在调用super的前或后):
150+
147151
```
148152
@Override
149153
public void onSaveInstanceState(Bundle savedInstanceState) {
@@ -164,13 +168,15 @@ public void onRestoreInstanceState(Bundle savedInstanceState) {
164168
int myInt = savedInstanceState.getInt("MyInt");
165169
String myString = savedInstanceState.getString("MyString");
166170
}
171+
167172
```
173+
168174
---
169175
170176
171177
178+
**Fragment的生命周期和activity如何的一个关系**
172179
173-
**11.Fragment的生命周期和activity如何的一个关系**
174180
这我们引用本知识库里的一张图片:
175181
![Mou icon](https://github.com/GeniusVJR/LearningNotes/blob/master/Part1/Android/FlowchartDiagram.jpg?raw=true)
176182
@@ -180,10 +186,15 @@ public void onRestoreInstanceState(Bundle savedInstanceState) {
180186
这是因为Activity很难对Thread进行控制,当Activity被销毁之后,就没有任何其它的办法可以再重新获取到之前创建的子线程的实例。而且在一个Activity中创建的子线程,另一个Activity无法对其进行操作。但是Service就不同了,所有的Activity都可以与Service进行关联,然后可以很方便地操作其中的方法,即使Activity被销毁了,之后只要重新与Service建立关联,就又能够获取到原有的Service中Binder的实例。因此,使用Service来处理后台任务,Activity就可以放心地finish,完全不需要担心无法对后台任务进行控制的情况。
181187
182188
183-
**16.Intent的使用方法,可以传递哪些数据类型。**
189+
**Intent的使用方法,可以传递哪些数据类型。**
190+
191+
通过查询Intent/Bundle的API文档,我们可以获知,Intent/Bundle支持传递基本类型的数据和基本类型的数组数据,以及String/CharSequence类型的数据和String/CharSequence类型的数组数据。而对于其它类型的数据貌似无能为力,其实不然,我们可以在Intent/Bundle的API中看到Intent/Bundle还可以传递Parcelable(包裹化,邮包)和Serializable(序列化)类型的数据,以及它们的数组/列表数据。
192+
193+
所以要让非基本类型和非String/CharSequence类型的数据通过Intent/Bundle来进行传输,我们就需要在数据类型中实现Parcelable接口或是Serializable接口。
184194
195+
[http://blog.csdn.net/kkk0526/article/details/7214247](http://blog.csdn.net/kkk0526/article/details/7214247)
185196
186-
**17.Fragment生命周期**
197+
**Fragment生命周期**
187198
188199
![](http://7xntdm.com1.z0.glb.clouddn.com/fragment_lifecycle.png)
189200
@@ -216,6 +227,8 @@ public void onRestoreInstanceState(Bundle savedInstanceState) {
216227
217228
**ContentProvider使用方法**
218229
230+
[http://blog.csdn.net/juetion/article/details/17481039](http://blog.csdn.net/juetion/article/details/17481039)
231+
219232
---
220233
221234
**目前能否保证service不被杀死**
@@ -271,19 +284,25 @@ animation-list xml布局
271284
272285
**Android的数据存储形式。**
273286
274-
* SharedPrefrences方式
275-
用来存储"key-value"格式的数据,它是一个轻量级的键值存储机制,实际上他就是在Android本地创建一个.xml文件,内容就是你在java代码里面写进去的值。
276-
277-
---
278287
279-
**Sqlite的基本操作。**
288+
289+
* SQLite:SQLite是一个轻量级的数据库,支持基本的SQL语法,是常被采用的一种数据存储方式。
290+
Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的api
291+
292+
* SharedPreference: 除SQLite数据库外,另一种常用的数据存储方式,其本质就是一个xml文件,常用于存储较简单的参数设置。
293+
294+
* File: 即常说的文件(I/O)存储方法,常用语存储大数量的数据,但是缺点是更新数据将是一件困难的事情。
295+
296+
* ContentProvider: Android系统中能实现所有应用程序共享的一种数据存储方式,由于数据通常在各应用间的是互相私密的,所以此存储方式较少使用,但是其又是必不可少的一种存储方式。例如音频,视频,图片和通讯录,一般都可以采用此种方式进行存储。每个Content Provider都会对外提供一个公共的URI(包装成Uri对象),如果应用程序有数据需要共享时,就需要使用Content Provider为这些数据定义一个URI,然后其他的应用程序就通过Content Provider传入这个URI来对数据进行操作。
280297
281298
---
282299
300+
**Sqlite的基本操作。**
283301
284302
285-
**18.Merge、ViewStub的作用。**
303+
[http://blog.csdn.net/zgljl2012/article/details/44769043](http://blog.csdn.net/zgljl2012/article/details/44769043)
286304
305+
---
287306
288307
**如何判断应用被强杀**
289308
@@ -293,22 +312,26 @@ animation-list xml布局
293312
294313
如果在每一个Activity的onCreate里判断是否被强杀,冗余了,封装到Activity的父类中,如果被强杀,跳转回主界面,如果没有被强杀,执行Activity的初始化操作,给主界面传递intent参数,主界面会调用onNewIntent方法,在onNewIntent跳转到欢迎页面,重新来一遍流程。
295314
296-
**19.Json有什么优劣势。**
315+
**Json有什么优劣势。**
297316
298-
**20.怎样退出终止App**
317+
**怎样退出终止App**
299318
300-
**21.Asset目录与res目录的区别。**
319+
**Asset目录与res目录的区别。**
320+
res 目录下面有很多文件,例如 drawable,mipmap,raw 等。res 下面除了 raw 文件不会被压缩外,其余文件都会被压缩。同时 res目录下的文件可以通过R 文件访问。Asset 也是用来存储资源,但是 asset 文件内容只能通过路径或者 AssetManager 读取。 [官方文档](https://developer.android.com/studio/projects/index.html)
301321
302-
**22.Android怎么加速启动Activity。**
322+
**Android怎么加速启动Activity。**
323+
分两种情况,启动应用 和 普通Activity
324+
启动应用 :Application 的构造方法,onCreate 方法中不要进行耗时操作,数据预读取(例如 init 数据) 放在异步中操作
325+
启动普通的Activity:A 启动B 时不要在 A 的 onPause 中执行耗时操作。因为 B 的 onResume 方法必须等待 A 的 onPause 执行完成后才能运行
303326
304-
**23.Android内存优化方法:ListView优化,及时关闭资源,图片缓存等等。**
327+
**Android内存优化方法:ListView优化,及时关闭资源,图片缓存等等。**
305328
306-
**24.Android中弱引用与软引用的应用场景。**
329+
**Android中弱引用与软引用的应用场景。**
307330
308-
**25.Bitmap的四种属性,与每种属性队形的大小。**
331+
**Bitmap的四种属性,与每种属性队形的大小。**
309332
310333
311-
**26.View与View Group分类。自定义View过程:onMeasure()、onLayout()、onDraw()。**
334+
**View与View Group分类。自定义View过程:onMeasure()、onLayout()、onDraw()。**
312335
313336
如何自定义控件:
314337
@@ -326,18 +349,18 @@ animation-list xml布局
326349
7. 状态的恢复与保存
327350
328351
329-
330-
331-
332352
**Android长连接,怎么处理心跳机制。**
333353
354+
---
334355
335356
**View树绘制流程**
336357
337358
---
338359
339360
**下拉刷新实现原理**
340361
362+
---
363+
341364
**你用过什么框架,是否看过源码,是否知道底层原理。**
342365
343366
Retrofit
@@ -346,7 +369,7 @@ EventBus
346369
347370
glide
348371
349-
372+
---
350373
351374
**Android5.0、6.0新特性。**
352375
@@ -369,6 +392,9 @@ Android7.0新特性
369392
* 增强的Java8语言模式
370393
* 夜间模式
371394
395+
---
396+
397+
372398
**Context区别**
373399
374400
* Activity和Service以及Application的Context是不一样的,Activity继承自ContextThemeWraper.其他的继承自ContextWrapper
@@ -379,8 +405,9 @@ Android7.0新特性
379405
* 尽管Application、Activity、Service都有自己的ContextImpl,并且每个ContextImpl都有自己的mResources成员,但是由于它们的mResources成员都来自于唯一的ResourcesManager实例,所以它们看似不同的mResources其实都指向的是同一块内存
380406
* Context的数量等于Activity的个数 + Service的个数 + 1,这个1为Application
381407
408+
---
382409
383-
**32.IntentService的使用场景与特点。**
410+
**IntentService的使用场景与特点。**
384411
385412
>IntentService是Service的子类,是一个异步的,会自动停止的服务,很好解决了传统的Service中处理完耗时操作忘记停止并销毁Service的问题
386413
@@ -391,17 +418,8 @@ Android7.0新特性
391418
392419
onStartCommand中回调了onStart,onStart中通过mServiceHandler发送消息到该handler的handleMessage中去。最后handleMessage中回调onHandleIntent(intent)。
393420
421+
---
394422
395-
[ANR问题](https://github.com/GeniusVJR/LearningNotes/blob/master/Part1/Android/ANR问题.md)
396-
397-
398-
399-
**Handler机制**
400-
401-
402-
**AsyncTask相关问题,3.0前后的bug,如何实现并发?底层实现原理?**
403-
404-
**Android的三级缓存如何实现**
405423
406424
**图片缓存**
407425
@@ -411,37 +429,14 @@ onStartCommand中回调了onStart,onStart中通过mServiceHandler发送消息
411429
int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
412430
Log.d("TAG", "Max memory is " + maxMemory + "KB");
413431
```
414-
**AIDL**
415-
416-
**Binder和IPC机制**
417-
418-
**触摸事件分发机制**
419-
420-
**Activity启动流程以及界面展示过程**
421-
422-
**Android系统启动流程**
423-
424-
**Zygote的启动过程。**
425-
426-
**Android中的MVC,MVP和MVVM**
427-
428-
**涉及动态加载技术点相关**
429-
430-
---
431-
432-
[Android内存泄漏](https://github.com/GeniusVJR/LearningNotes/blob/master/Part1/Android/Android内存泄漏总结.md)
433-
434-
****
435-
436-
[Android中的性能优化](http://blog.csdn.net/codeemperor/article/details/51480671)
437432
438433
---
439434
440435
**Gradle**
441436
442437
构建工具、Groovy语法、Java
443438
444-
Jar包里面只有代码,aar里面不光有代码还包括
439+
Jar包里面只有代码,aar里面不光有代码还包括代码还包括资源文件,比如 drawable 文件,xml 资源文件。对于一些不常变动的 Android Library,我们可以直接引用 aar,加快编译速度
445440
446441
---
447442

0 commit comments

Comments
 (0)