Android面试(Activity生命周期)

Activity作为Android的四大组件之一,是我们Android开发中打交道最为频繁的组件之一。而我们实际运用中却没有注意到很多Activity的细节知识点。所以在面试之中如果Activity相关的知识我们不能很好的回答,说明我们不是一名合格的Android开发工程师。我们将从以下4点去复习Activity相关知识:

1、什么是Activity

2、Activity的四种状态

3、Activity的神功周期

4、Android进程的优先级


1、什么是Activity:

Activity作为Android的四大组件,Activity是Android与用户交互的窗口,它提供了界面与用户进行交互。


2、Activity的四种状态

running/paused/stopped/killed

running状态:Activity处于活动状态,用户点击屏幕,屏幕会做出反应,它是Activity处于栈顶的一种状态。

paused状态:Activity失去焦点或被非全屏的Activity覆盖或被透明的Activity覆盖,Activity仍然可见,但失去与用户交互的能力,Activity此时所有的状态信息和成员变量还被保存,当内存紧张时,这个Activity会被回收。

stopped状态:Activity被另一个Activity完全覆盖,Activity不可见,Activity此时所有的状态信息和成员变量还被保存,当内存紧张时,这个Activity会被回收。

killed状态:Activity被系统回收,Activity保存的信息和成员变量也被回收。


3、Activity生命周期:


Activity启动:onCreate->onStart->onResume

onCreate:表示Activity正在被创建,我们可以做一些初始化工作,比如加载布局资源和初始化Activity所需数据。

onStart:表示Activity被启动,这Activity已经可见了,但是还没有处于前台,所以可以理解为Activity可见但我们无法与Activity交互。

onResume:表示Activity可见并显示前台,可以与用户交互。


点击Home键返回(Activity不可见):onPause->onStop

onPause:Activity可见,不可交互,与onResume对应。

onStop:Activity不可见,处于停止状态,与onStart对应,内存紧张时,Activity会被回收。


再次回到Activity:onRestart->onStart->onResume

onResume:表示Activity重新由不可见状态处于可见状态时调用。


退出当前Activity:onPause->onStop->onDestory

onDestory:表示Activity销毁,可以在此方法中做一些资源回收的操作


4、Android进程的优先级

当系统的内存不足时, android系统将根据进程优先级选择杀死一些不太重要的进程. 进程优先级从高到低分别为:

前台>可见>服务>后台>空

1. 前台进程. 以下的进程为前台进程:

a. 进程中包含处于前台的正与用户交互的activity;

b. 进程中包含与前台activity绑定的service;

c. 进程中包含调用了startForeground()方法的service;

d. 进程中包含正在执行onCreate(), onStart(), 或onDestroy()方法的service;

e. 进程中包含正在执行onReceive()方法的BroadcastReceiver.

系统中前台进程的数量很少, 前台进程几乎不会被杀死. 只有当内存低到无法保证所有的前台进程同时运行时才会选择杀死某个前台进程.


2. 可见进程. 以下进程为可见进程:

a. 进程中包含未处于前台但仍然可见的activity(调用了activity的onPause()方法, 但没有调用onStop()方法). 典型的情况是运行activity时弹出对话框, 此时的activity虽然不是前台activity, 但其仍然可见.

b. 进程中包含与可见activity绑定的service.

可视进程不会被系统杀死, 除非为了保证前台进程的运行而不得已为之.


3. 服务进程. 进程中包含已启动的service.


4. 后台进程. 进程中包含不可见的activity(onStop()方法调用后的activity). 后台进程不会直接影响用户体验, 为了保证前台进程/可视进程/服务进程的运行, 系统随时都有可能杀死一个后台进程. 一个正确的实现了生命周期方法的activity处于后台时被系统杀死, 可以在用户重新启动它时恢复之前的运行状态.


5. 空进程. 不包含任何处于活动状态的进程是一个空进程. 系统经常杀死空进程, 这不会造成任何影响. 空进程存在的唯一理由是为了缓存一些启动数据, 以便下次可以更快的启动. 


进程优先级的额外说明

1. 系统会赋予进程尽可能高的优先级. 例如一个进程既包含已启动的service, 也包含前台activity, 则这个进程会被视为前台进程. 

2. 由于组件之间的依赖性, 进程的优先级有可能被提高. 假如进程A服务于进程B, 则进程A的优先级不能低于进程B. 比如, 进程A的ContentProvider组件正在服务于进程B的某个组件, 或者进程A的service组件和进程B的某个组件绑定等, 这些情况下, 进程A的优先级都不会低于进程B(如果按照优先级规则, 进程A的优先级确实低于进程B, 则系统会选择提高进程A的优先级到和进程B相同).

3. 由于服务进程的优先级高于后台进程, 因此如果activity需要执行耗时操作, 最好还是启动一个service来完成. 当然, 在activity中启动子线程完成耗时操作也可以, 但是这样做的缺点在于, 一旦activity不再可见, activity所在的进程成为后台进程, 而内存不足时后台进程随时都有可能被系统杀死(但是启动service完成耗时操作会带来数据交互的问题, 比如耗时操作需要实时更新UI控件的状态的话, service就不是一个好的选择). 基于同样的考虑, 在BroadcastReceiver中也不应该执行耗时操作, 而应该启动service来完成(当然, BroadcastReceiver的生命周期过于短暂, 也决定了不能在其中执行耗时操作).


关于进程相关知识,参考:http://blog.csdn.net/fhy_2008/article/details/7328967
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值