5.NDK
Dalvik虚拟机在调用一个成员函数的时候,如果发现该成员函数是一个JNI方法,那么就会直接跳到它的地址去执行。也就是说,JNI方法是直接在本地操作系统执行的,而不是Dalvik虚拟机解释器执行。由此也可以看出,JNI方法是Android应用程序与本地操作系统直接进行通信的一个手段。
JNI原理:
[Dalvik虚拟机JNI方法的注册过程分析]
例子:当libnanosleep.so文件被加载的时候,函数JNI_OnLoad就会被调用。在函数JNI_OnLoad中,参数vm描述的是当前线程中的Dalvik虚拟机,通过调用它的成员函数GetEnv就可以获得一个JNIEnv对象。有了这个JNIEnv对象之后,我们就可以调用另外一个函数jniRegisterNativeMethods来向当前进程的Dalvik虚拟机注册一个JNI方法。
6.Android系统启动过程,App启动过程
App启动过程:
[Activity启动过程详解]
从桌面点击到activity启动的过程
1、Launcher线程捕获onclick的点击事件,调用Launcher.startActivitySafely,进一步调用Launcher.startActivity,最后调用父类Activity的startActivity。
2、Activity和ActivityManagerService交互,引入Instrumentation,将启动请求交给Instrumentation,调用Instrumentation.execStartActivity。
3、调用ActivityManagerService的startActivity方法,这里做了进程切换(具体过程请查看源码)。
4、开启Activity,调用onCreate方法
7.Activity,Fragment,Service生命周期
常见的例子:程序正运行着来电话了,这个程序咋办呢?中止了呗,如果中止的时候新出的一个Activity是全屏的onPause->onStop,恢复的时候onStart->onResume,如果打断这个应用程序的是一个Theme为Translucent或者Dialog的Activity那么只是onPause,恢复的时候onResume。
- onPause:恢复的时候onResume
- onCreate:在这里创建界面,做一些数据的初始化工作
- onStart:到这一步变成用户可见不可交互的
- onPause:到这一步是可见但不可交互的,系统会停止动画等消耗CPU的事情,应该在这里保存你的一些 数据,因为这个时候你的程序的优先级降低,有可能被 系统回收。在这里保存的数据,应该在onResume里读出来。注意:这个方法里做的事情时间要短,因为下一个Activity不会等到这个方法完成才启动。
- onStop:变得不可见,被下一个Activity覆盖了(onPause和onStop的区别是否可见)
- onDestroy:这是Activity被干掉前最后一个被调用方法了,可能是外面类调用finish方法或者是系统为了节省空间将它暂时性的干掉,可以用isFinishing()来判断它,如果你有一个ProgressDialog在线程中转动,请在onDestroy里把它cancel掉,不然等线程结束的时候,调用Dialog的cancel会抛出异常的。
onPause,onstop,onDestroy,三种状态下,Activity都有可能被系统干掉。
启动另一个Activity然后finish,先调用旧Activity的onPause方法,然后调用新的Activity和onCreate->onStart->onResume方法,然后调用旧Activity的onStop->onDestroy方法。
如果没有调用finish那么onDestroy方法不会被调用,而且在onStop之前还会调用onSavedInstanceState方法
onRestart方法执行完了之后还会调用onStart方法
fragment:[SupportFragmentManager,childFragment]
service:
[Android Service的生命周期]
[android-Service和Thread的区别]
Service和Intent Service:没啥区别,只是IntentService在onCreate方法中开启新的HandlerThread去执行。
Service运行的进程和线程:当它运行的时候如果是LocalService,那么对应的Service是运行在主进程的main线程上的。如onCreate,onStart这些函数都是在系统调用的时候在主进程的main线程上运行的。如果是RemoteSevice,那么对应的Service则是运行在独立的main线程上。
- 服务不是单一的进程,服务没有自己的进程,应用程序可以不同,服务运行在相同的进程中
- 服务不是线程,可以在线程中工作
- 在应用中,如果是长时间的在后台运行,而且不需要交互的情况下,使用服务
- 同样是在后台运行,不需要交互的情况下,如果只是完成某个任务,之后就不需要运行,而且可能是多个任务,需要长时间运行的情况下使用线程
- 如果任务占用CPU时间多,资源大的情况下,要使用线程
Thread的运行是独立于Activity的,也就是说当一个Activity被finish之后,如果你没有主动停止Thread或者Thread里的run方法没有执行完毕的话,Thread就会一直执行。
8.View绘画机制
View的绘制主要涉及三个方法:onMeasure()、onLayout()、onDraw()
- onMeasure主要用于计算view的大小,onLayout主要用于确定view在ContentView中的位置,onDraw主要是绘制View。
- 在执行onMeasure()、onLayo