根据慕课BAT大咖助力 全面升级Android面试课程进行总结
参考整理自:
https://blog.csdn.net/qq_23575921/article/details/78947051
https://www.jianshu.com/p/f85e83127e50
一、Activity
1、Activity的四种状态
-
running :活动状态。可以跟用户进行交互。位于栈顶
-
paused :可见但不可以交互,可能被新的非全屏的Activity或一个透明的Activity覆盖,成员变量和状态信息存在。内存紧张时Activity会被回收
-
stopped :Activity完全被覆盖不可见。成员变量和状态信息存在。内存紧张时activity会被回收
-
killed :Activity被回收
2、Activity的生命周期
-
onCreate :Activity第一次被实例化的时候系统会调用,整个生命周期只调用1次该方法。
通常用于完成初始化操作,比如加载布局、绑定事件等。 -
onStart :当Activity由不可见变为可见时调用。
-
onResume :当Activity和准备好和用户进行交互的时候调用。此时活动一定位于返回栈的站定,并且处于运行状态。
-
onPause :当系统准备去启动或恢复另一个Activity的时候调用。通常会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。
-
onStop :当Activity完全不可见的时候调用,和onPause()方法的却别在于,如果启动的新Activity是对话框或透明的,那就只执行onPause()方法而不会执行onStop()方法。如果内存紧张,系统会直接结束这个Activity,而不会触发 onStop() 方法。
-
onDestroy :当Activity被系统销毁时调用,整个生命周期只调用1次。用来释放onCreate ()方法中创建的资源,如结束线程,清空数据,注销广播等。和 onStop() 方法一样,如果内存紧张,系统会直接结束这个Activity而不会触发该方法。
-
onRestart :当处于停止状态的Activity需要变为运行状态的时候调用该方法。
Activity启动->onCreate()->onStart()->onResume()
点击home键回到主界面(Activity不可见)->onPause()->onStop()
当我们再次回到原Activity时->onRestart()->onStart()->onResume()
退出当前Activity时->onPause()->onStop()->onDestroy()
完整生存期:onCreate() -> onDestory()
可见生存期:onStart() -> onStop()
前台生存期:onResume() -> onPause()
3、Android进程优先级
-
前台进程:持有处于前台和用户交互的Activity,或者和前台Activity绑定的service
-
可见进程:持有有处于可见但并不是处于前台、用户不能点击的Activity,或者和可见Activity绑定的service
-
服务进程:除了符合前台进程和可见进程条件的Service,其它的Service都是服务进程
-
后台进程:持有不可见的activity就是后台进程,比如按home键将Activity切换至后台。通常情况下都会有很多后台进程,当内存不足的时候,会优先回收最长时间没有使用过的进程
-
空进程:不属于前面4种的任何一种,目的是为了缓存加速组件的下一次启动,系统可以随时杀掉空进程
4、Activity启动模式
-
standard-标准模式 :默认的启动模式,每次打开一个Activity都会创建一个新的实例,不管它是否存在,然后调用onCreate(),onStart(),onResume()方法
-
singleTop-栈顶复用模式 :如果打开的Activity实例位于任务栈的栈顶,则直接复用并调用onNewIntent()方法,否则创建新实例
-
singleTask-栈内复用模式 :如果打开的Activity实例位于任务栈内,则直接复用并调用ClearTop()方法将上面的Activity全部出栈,然后调用onNewIntent()方法
-
singleInstance-全局唯一模式 :如果打开的Activity有实例,则直接复用并调度到前台。否则为Activity单独占用一个任务栈,保证栈内只有这一个Activity
5、scheme跳转协议
Android中的scheme是一种页面内的跳转协议,是一种非常好的实现机制。通过scheme协议,服务器可以定制化的告诉app跳转哪个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面等。
二、 Fragment
1、Fragment为什么会被称为第五大组件
Fragment相比Activity更节省内存,能动态灵活的加载到Activity中去配合ViewPager使用,更方便的切换UI也更适合大屏幕。
2、Fragment加载到Activity的两种方式
- 静态加载
<fragment android:layout_width="match_parent" android:layout_height="match_parent" />
- 动态加载
FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); DemoFragment fragment = new DemoFragment(); fragmentTransaction.add(R.id.content, fragment);//容器资源作为标志位,把fragment添加到对应的位置 fragmentTransaction.addToBackStack("DemoFragment"); fragmentTransaction.commit();
3、FragmentPagerAdapter与FragmentStatePagerAdapter
-
FragmentPagerAdapter适用于页面较少的情况
-
FragmentStatePagerAdapter适用于页面较多的情况,每次切换回收内存
4、Fragment生命周期
5、Fragment通信
-
在Fragment间利用广播
-
在Fragment中调用Activity中的方法 getActivity
-
在Fragment中调用Fragment中的方法 接口回调
-
在Fragment中调用Fragment中的方法 findFragmentById
6、Fragment部分方法
-
add:添加Fragment,置于栈顶
-
replace:替换Fragment,清空对应容器Fragment,置于栈顶
-
remove:移除Fragment,显示下层Fragment
-
addToBackStack:添加
事务
到回退栈,置于栈顶 -
popBackStack:将最上层的
事务
弹出回退栈(根据具体参数,可以回退到对应的事务)
三、Service
1、Service的定义
-
Service是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件,可由其他组件启动,一旦启动可在后台长时间运行,即使启动它的组件已经被销毁,也不会受影响。另外也可以把Service绑定到activity,从而进行数据交互。
-
Local Service运行在主线程,不能做耗时操作。
2、Service与Thread
-
Thread:Thread 线程是程序执行的最小单元,可以用来执行异步操作,主要用来做耗时操作
-
Service:Service 是android的一种机制,用来后台执行长时间运行操作。如果是本地的Service,则运行在主线程,不可以做耗时操作,如果要做,在Service中添加Thread线程去做
3、Service的启动
-
startService:onCreate首次创建服务时调用,如果服务已经存在,则不会再调用。每次通过每次重启服务都会调用onStartCommand()方法。调用stopService(Intent)方法停止服务
-
bindService:创建BindService服务端继承自Service,在类中创建一个实现IBinder接口的实例对象并提供公共方法给客户端调用。从onBind()回调方法返回此Binder实例,在客户端中,从onServiceConnected()回调方法中接收Binder,并使用提供的方法调用绑定服务。多个activity可以绑定一个服务,绑定解除时服务销毁
四、BroadcastReceiver
1、广播定义
在android中,broadcast是一种广泛运用在应用程序内部或之间传输信息的机制,Android中要发送的广播内容是一个Intent,这个Intent中可以携带我们要传送的数据。
2、广播使用场景
-
同一app内,单个或多个线程之间的同一组件内的消息通信,更推荐用handler解决
-
同一app内,单个进程的不同组件之间的消息通信,更推荐用EventBus解决
-
同一app内,多个进程的不同组件之间的消息通信
-
不同app之间的组件之间的消息通信
-
Android系统广播在特定情况下与App之间的消息通信
后三种常用广播解决
3、广播的种类
-
普通广播(Normal Broadcast)
-
系统广播(System Broadcast)
-
有序广播(Ordered Broadcast)
-
粘性广播(Sticky Broadcast)
-
App应用内广播(Local Broadcast)
4、广播的注册
-
静态注册:注册完成就一直运行,Activity销毁或者app进程被杀掉仍然能收到广播
-
动态注册:跟随Activity的生命周期
5、内部实现机制
-
自定义广播接收器BroadcastReceiver,并复写onReceive方法
-
通过Binder机制向AMS(
Activity Manager Service
)进行注册 -
广播发送者通过Binder机制向AMS发送广播
-
AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般是activity)相应的消息循环队列中
-
消息循环执行,拿到此广播,回调BroadcastReceiver的onReceive方法
6、LocalBroadcastManager
-
高效性:比系统的全局广播更高效
-
安全性:只在自身app内传播,不必担心信息泄露
五、Binder
1、为什么使用Binder
Android使用的Linux内核拥有着非常多的跨进程通信机制,比如管道,System V,Socket等。使用Binder主要有两个优点:
-
性能:更加高效
-
安全:支持通信双发的身份校验(也是权限模型的基础)
2、Binder的通信模型
通信步骤如下:
-
SM建立(建立通信录);首先有一个进程向驱动提出申请为ServiceManager
-
各个Server向SM注册(完善通信录);每个Server端进程启动之后,向SM报告名字和地址
-
Client想要与Server通信,首先询问SM对应Server名的通信地址,收到后即可开始通信
3、Binder的跨进程通信机制
使用代理模式,对于Binder的访问,如果是在同一个进程,那么直接返回原始的Binder实体;如果在不同进程,那么就给他一个代理对象(影子)。Client进程只不过是持有了Server端的代理;代理对象协助驱动完成了跨进程通信。由于SM与Server通常不在一个进程,Server进程向SM注册的过程也是跨进程通信。
4、到底什么是Binder
-
通常意义下,Binder指的是一种通信机制
-
对于Server进程来说,Binder知道是Binder本地对象/对于Client来说,Binder指的是Binder代理对象
-
对于传输过程而言,Binder是可以进行跨进程传递的对象
5、AIDL
AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definition language的缩写,对于小白来说,AIDL的作用是让你可以在自己的APP里绑定一个其他APP的service,这样你的APP可以和其他APP交互。
六、ANR
1、什么是ANR
Application Not Responding
在Activity中5秒或广播中10秒系统无响应
2、ANR产生的原因
-
主线程被IO操作阻塞
-
主线程中存在耗时的计算
3、如何解决ANR
-
使用AsyncTast处理IO操作
-
使用Handler处理工作线程的耗时任务
-
Activity的onCreate和onResume回调中尽量避免耗时的代码
4、什么是OOM
当前占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出Out Of Memory异常