Skip to content

Commit 8de099c

Browse files
committed
更新Android基础知识和APP启动过程
1 parent f44fb94 commit 8de099c

2 files changed

Lines changed: 79 additions & 6 deletions

File tree

Part1/Android/APP启动过程.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#APP启动过程
2+
---
3+
4+
![](http://7xntdm.com1.z0.glb.clouddn.com/activity_start_flow.png)
5+
6+
* 上图就可以很好的说明App启动的过程
7+
* ActivityManagerService组织回退栈时以ActivityRecord为基本单位,所有的ActivityRecord放在同一个ArrayList里,可以将mHistory看作一个栈对象,索引0所指的对象位于栈底,索引mHistory.size()-1所指的对象位于栈顶
8+
* Zygote进程孵化出新的应用进程后,会执行ActivityThread类的main方法.在该方法里会先准备好Looper和消息队列,然后调用attach方法将应用进程绑定到ActivityManagerService,然后进入loop循环,不断地读取消息队列里的消息,并分发消息。
9+
* ActivityThread的main方法执行后,应用进程接下来通知ActivityManagerService应用进程已启动,ActivityManagerService保存应用进程的一个代理对象,这样ActivityManagerService可以通过这个代理对象控制应用进程,然后ActivityManagerService通知**应用进程**创建入口Activity的实例,并执行它的生命周期方法

Part1/Android/Android基础知识.md

Lines changed: 70 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,27 @@
2828
* TableLayout(表格布局)
2929

3030
将子元素的位置分配到行或列中,一个TableLayout由许多的TableRow组成
31+
32+
3133
---
3234

3335

3436
**Activity生命周期。**
3537

38+
* 启动Activity:
39+
onCreate()—>onStart()—>onResume(),Activity进入运行状态。
40+
* Activity退居后台:
41+
当前Activity转到新的Activity界面或按Home键回到主屏:
42+
onPause()—>onStop(),进入停滞状态。
43+
* Activity返回前台:
44+
onRestart()—>**onStart()**—>onResume(),再次回到运行状态。
45+
* Activity退居后台,且系统内存不足,
46+
系统会杀死这个后台状态的Activity,若再次回到这个Activity,则会走onCreate()–>onStart()—>onResume()
47+
* 锁定屏与解锁屏幕
48+
**只会调用onPause(),而不会调用onStop()方法,开屏后则调用onResume()**
49+
50+
---
51+
3652

3753
**Acitivty的四种启动模式与特点。**
3854

@@ -134,16 +150,60 @@ public void onRestoreInstanceState(Bundle savedInstanceState) {
134150

135151
**Fragment生命周期**
136152

153+
![](http://7xntdm.com1.z0.glb.clouddn.com/fragment_lifecycle.png)
154+
155+
注意和Activity的相比的区别,按照执行顺序
156+
157+
* onAttach(),onDetach()
158+
* onCreateView(),onDestroyView()
159+
160+
---
161+
137162
**Service的两种启动方法,有什么区别**
138163

139164
**广播的两种动态注册和静态注册有什么区别。**
140165

141-
**ContentProvider使用方法**
166+
* 静态注册:在AndroidManifest.xml文件中进行注册,当App退出后,Receiver仍然可以接收到广播并且进行相应的处理
167+
* 动态注册:在代码中动态注册,当App退出后,也就没办法再接受广播了
168+
169+
---
142170

143171

172+
**ContentProvider使用方法**
173+
174+
---
144175

145176
**目前能否保证service不被杀死**
146177

178+
**Service设置成START_STICKY**
179+
180+
* kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样
181+
182+
**提升service优先级**
183+
* 在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = "1000"这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时适用于广播。
184+
* 【结论】目前看来,priority这个属性貌似只适用于broadcast,对于Service来说可能无效
185+
186+
**提升service进程优先级**
187+
* Android中的进程是托管的,当系统进程空间紧张的时候,会依照优先级自动进行进程的回收
188+
* 当service运行在低内存的环境时,将会kill掉一些存在的进程。因此进程的优先级将会很重要,可以在startForeground()使用startForeground()将service放到前台状态。这样在低内存时被kill的几率会低一些。
189+
* 【结论】如果在极度极度低内存的压力下,该service还是会被kill掉,并且不一定会restart()
190+
191+
**onDestroy方法里重启service**
192+
* service +broadcast 方式,就是当service走ondestory()的时候,发送一个自定义的广播,当收到广播的时候,重新启动service
193+
* 也可以直接在onDestroy()里startService
194+
* 【结论】当使用类似口口管家等第三方应用或是在setting里-应用-强制停止时,APP进程可能就直接被干掉了,onDestroy方法都进不来,所以还是无法保证
195+
196+
**监听系统广播判断Service状态**
197+
* 通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的Service是否还存活,别忘记加权限
198+
* 【结论】这也能算是一种措施,不过感觉监听多了会导致Service很混乱,带来诸多不便
199+
200+
**在JNI层,用C代码fork一个进程出来**
201+
202+
* 这样产生的进程,会被系统认为是两个不同的进程.但是Android5.0之后可能不行
203+
204+
**root之后放到system/app变成系统级应用**
205+
206+
**大招: 放一个像素在前台(手机QQ)**
147207

148208
---
149209

@@ -282,14 +342,14 @@ Android7.0新特性
282342

283343
onStartCommand中回调了onStart,onStart中通过mServiceHandler发送消息到该handler的handleMessage中去。最后handleMessage中回调onHandleIntent(intent)。
284344

285-
**ANR问题**
286345

287346
[ANR问题](https://github.com/GeniusVJR/LearningNotes/blob/master/Part1/Android/ANR问题.md)
288347

289348

290349

291350
**Handler机制**
292351

352+
293353
**AsyncTask相关问题,3.0前后的bug,如何实现并发?底层实现原理?**
294354

295355
**Android的三级缓存如何实现**
@@ -318,25 +378,29 @@ onStartCommand中回调了onStart,onStart中通过mServiceHandler发送消息
318378

319379
**涉及动态加载技术点相关**
320380

321-
**Android内存泄漏**
381+
---
322382

323383
[Android内存泄漏](https://github.com/GeniusVJR/LearningNotes/blob/master/Part1/Android/Android内存泄漏总结.md)
324384

325-
**Android中的性能优化**
385+
****
326386

327-
[http://blog.csdn.net/codeemperor/article/details/51480671](http://blog.csdn.net/codeemperor/article/details/51480671)
387+
[Android中的性能优化](http://blog.csdn.net/codeemperor/article/details/51480671)
388+
389+
---
328390

329391
**Gradle**
330392

331393
构建工具、Groovy语法、Java
332394

333395
Jar包里面只有代码,aar里面不光有代码还包括
334396

397+
---
398+
335399
**你是如何自学Android**
336400

337401
首先是看书和看视频敲代码,然后看大牛的博客,做一些项目,向github提交代码,觉得自己API掌握的不错之后,开始看进阶的书,以及看源码,看完源码学习到一些思想,开始自己造轮子,开始想代码的提升,比如设计模式,架构,重构等。
338402

339-
403+
---
340404

341405

342406

0 commit comments

Comments
 (0)