Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

Android面试之Activity

$
0
0

对于面试,有人恐惧有人享受其过程,但对于不善言语的猿猴,想必面试一定很痛苦,不过不要紧,面试一般会分为两个环节:技术面试和人事面试。

想把自己面试过程遇到的问题总结一下,分享给更多朋友。


本文重点讲技术环节。


考虑良久,我认为还是要从Activity开始说起。引用《Android开发艺术探索》的开篇语的一句话就是:Activity时候如此重要,以至于开篇不得不讲到它。

在我看来,Activity确实是非常重要的。下面进入正题:

Activity作为Android开发中最基础的部分,面试中经常会遇到。由于Android系统是由四大组件所构成,且难度不不大,所以   如果在面试时没有将Activity相关问题回答好,我想基本上就会被Pass掉。

1.Activity的启动模式

2.Activity的生命周期

3.Activity的状态保存和恢复。


在介绍Activity的启动模式前,有必要先了解一下Activity的任务栈。所谓任务栈中的任务,可以单纯的理解为用户的操作行为。比如我们用QQ聊天,必须先打开QQ,找到好友,发送消息,这些都可以看做是任务。而这些任务,都运行在Activity中,在Activity的角度来看,任务就是用户将Activity放入任务栈中执行的过程。其中,一个进程可以有多个任务栈,而任务栈中的Activity会按照启动顺序依次被push到当前进程的任务栈中,而我们的跳转和返回事件,就是进栈和出栈的过程,以此来完成任务。那么任务栈和运行中的APP是一一对应的关系么?答案是否定的,一个APP的Activity可以属于不同的任务栈,同样,一个任务栈的Activity可以来自于不同的APP,这种情况通常是需要多个APP配合完成任务,例如有些APP中使用了XX地图等。


启动方式1.standard

默认的启动模式,每次使用该模式下的Activity都会创建一个新的Activity实例并push到任务栈中,这样就可能会出现一个任务栈中存在同一Activity的多个实例的情况。考虑一下,这样做什么好处和坏处呢?好处是使用简单,不需要额外配置,如果Activity比较轻量级那么用这种模式一般不会出现什么问题;坏处是,如果创建实例太过频繁或者Activity的开销较大,那么这种启动模式就很有可能带来性能问题,还有就是,在使用某些APP时,偶尔会出现使用BACK键返回,结果一直在几个页面来回切的情况,这有可能就是启动模式的选择有问题。

b.singleTop

栈顶复用模式,也就是说,当你想启动Activity A 时,如果目标任务栈中已经存在Activity A 且位于栈顶,那么系统就不会再次实例化它,而是直接使用栈顶的Activity A。这样有个好处,不会出现由于栈顶都是相同Activity而导致用户出现BACK键失灵的错觉。那么在什么情况下使用singleTop模式呢?比如某个APP的多个推送消息显示在通知栏,你想把他们都给点了,每次点击实际就是启动某个Activity,这时候如果使用的是singleTop模式,就可以有效避免重复创建同一Activity实例的工作。

c.singleTask

官方解释为:标志为singleTask的Activity,最多仅有一个实例存在,并且位于以它为根的Task中,所有对该Activity的请求,都会跳到该Activity的Task中展开进行。如果我们使用时,该Activity不在栈顶,那么位于它上方的Activity就会全部出栈,从而使其回到栈顶。什么时候该模式呢?我们一般在创建开销较大且经常被其他APP调用的Activity中使用,这种Activity一般作为程序的入口,比如浏览器的主页使用的就是singleTask。

d.singleInstance启动模式

singleInstance模式和singleTask很相似,他们的不同点仅在于,该模式下的Activity是它所属任务栈中的唯一Activity。可以看出,这样的Activity封闭性极强,能够很好地保持唯一性,也能大大减少不必要的开销。一个应用的例子就是XX地图,如果APP中使用了XX地图,那么当我们切到桌面,并进入到XX地图时,看到的页面跟之前是一样的。


生命周期

由于生命周期相对太简单太简单,而且到处都是有关生命周期的博客,这里提供@小孟6601的精彩回答,原文地址http://ask.csdn.net/questions/262577

由于回答太精彩了,本人学不来,所以就不发表自己的见解了


activity三种状态
(1)active:当Activity运行在屏幕前台(处于当前任务活动栈的最上面),此时它获取了焦点能响应用户的操作,属于活动状态,同一个时刻只会有一个Activity处于活动(Active)。
(2)paused:当Activity失去焦点但仍对用户可见(如在它之上有另一个透明的Activity或Toast、AlertDialog等弹出窗口时)它处于暂停状态。暂停的Activity仍然是存活状态(它保留着所有的状态和成员信息并保持和窗口管理器的连接),但是当系统内存极小时可以被系统杀掉。
(3)stoped:完全被另一个Activity遮挡时处于停止状态,它仍然在内存中保留着所有的状态和成员信息。只是对用户不可见,当其他地方需要内存时它往往被系统杀掉。
3、activity七个方法
onCreate():当Activity第一次被实例化的时候系统会调用,整个生命周期只调用1次这个方法。通常用于初始化设置,为Activity设置所要使用的布局文件,为按钮绑定监听器等静态的设置操作。
onStart():当Activity可见未获得用户焦点不能交互时系统会调用。
onRestart():当Activity已经停止然后重新被启动时系统会调用。
onResume():当Activity可见且获得用户焦点能交互时系统会调用。
onPause():用来存储持久数据。到这一步是可见但不可交互的,系统会停止动画等消耗CPU的事情。从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统收回。
onStop():当Activity被新的Activity完全覆盖不可见时被系统调用。
onDestroy():当Activity(用户调用finish()或系统由于内存不足)被系统销毁杀掉时系统调用,(整个生命周期只调用1次)用来释放onCreate()方法中创建的资源,如结束线程等。
4、android三个嵌套循环
(1)Activity完整的生命周期:从第一次调用onCreate()开始直到调用onDestroy()结束。
(2)Activity的可视生命周期:从调用onStart()到相应的调用onStop()。在这两个方法之间,可以保持显示Activity所需要的资源。如在onStart()中注册一个广播接收者监听影响你的UI的改变,在onStop()中注销。
(3)Activity的前台生命周期:从调用onResume()到相应的调用onPause()。
5、BroadcastReceiver广播接收器生命周期
生命周期只有十秒左右,如果在onReceive()内做超过十秒内的事情,就会报ANR(Application No Response)程序无响应的错误信息。它的生命周期为从回调onReceive()方法开始到该方法返回结果后结束。
6、Service服务生命周期
Service完整的生命周期从调用onCreate()开始直到调用onDestroy()结束。
Service有两种使用方法:
(1)以调用Context.startService()启动,而以调用Context.stopService()结束。
(2)以调用Context.bindService()方法建立,以调用Context.unbindService()关闭。

7、一个activity的启动过程
(1)第一个Activity的启动顺序:onCreate()——>onStart()——>onResume()
(2)当另一个Activity启动时:第一个Activity onPause()——>第二个Activity onCreate()——>onStart()——>onResume()——>第一个Activity onStop()
(3)当返回到第一个Activity时:第二个Activity onPause()——> 第一个Activity onRestart()——>onStart()——>onResume()——>第二个Activity onStop()——>onDestroy()
每一个Activity都处于某一个状态,对于开发者来说,是无法控制其应用程序处于某一个状态的,这些均由系统来完成。


Activity的状态保存和恢复


正常情况下,我们会在Activity的OnCreate时初始化一些工作。

在onDestroy的时候将无用的资源回收

基本上到这里就没什么好说的了。下面总结一下

(1) onStart和onResume的区别是onStart可见,还没有出现在前台,无法和用户进行交互。onResume获取到焦点可以和用户交互。


(2) 新Activity是透明主题时,旧Activity不会走onStop;


(3)Activity切换时,旧Activity的onPause会先执行,然后才会启动新的Activity;


(4)Activity在异常情况下被回收时,onSaveInstanceState方法会被回调,回调时机是在onStop之前,当Activity被重新创建的时候,onRestoreInstanceState方法会被回调,时序在onStart之后;


(5)Activity的LaunchMode


a.
 standard 系统默认。每次启动会重新创建新的实例,谁启动了这个Activity,这个Activity就在谁的栈里。


b.
 singleTop 栈顶复用模式。该Activity的onNewIntent方法会被回调,onCreate和onStart并不会被调用。


c.
 singleTask 栈内复用模式。只要该Activity在一个栈中存在,都不会重新创建,onNewIntent会被回调。如果不存在,系统会先寻找是否存在需要的栈,如果不存在该栈,就创建一个任务栈,然后把这个Activity放进去;如果存在,就会创建到已经存在的这个栈中。


d.
 singleInstance。具有此种模式的Activity只能单独存在于一个任务栈。


(5) 标识Activity任务栈名称的属性:TaskAffinity,默认为应用包名。


如果有什么不明白的或者需要探讨,欢迎留言或者加我们的QQ群一起讨论。我们的QQ群是140767523,人少,但是我们都致力于解决你的 问题。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------转载请注明出处。

作者:u012552275 发表于2016/8/21 16:34:19 原文链接
阅读:33 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>