2020-Android-面试重难点(万字篇),android屏幕适配的五种方式

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线程上。

  1. 服务不是单一的进程,服务没有自己的进程,应用程序可以不同,服务运行在相同的进程中
  2. 服务不是线程,可以在线程中工作
  3. 在应用中,如果是长时间的在后台运行,而且不需要交互的情况下,使用服务
  4. 同样是在后台运行,不需要交互的情况下,如果只是完成某个任务,之后就不需要运行,而且可能是多个任务,需要长时间运行的情况下使用线程
  5. 如果任务占用CPU时间多,资源大的情况下,要使用线程

Thread的运行是独立于Activity的,也就是说当一个Activity被finish之后,如果你没有主动停止Thread或者Thread里的run方法没有执行完毕的话,Thread就会一直执行。

8.View绘画机制

View的绘制主要涉及三个方法:onMeasure()、onLayout()、onDraw()

  1. onMeasure主要用于计算view的大小,onLayout主要用于确定view在ContentView中的位置,onDraw主要是绘制View。
  2. 在执行onMeasure()、onLayo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值