工作马上就要3年了,相比于同行的很多朋友,我的成长还是太慢,最近也是绞尽脑汁想要提升自己。但是这一行似乎也没有什么捷径, 只有不断地学习与总结才能提高自己吧。给自己挖个坑,希望自己能够慢慢填上,相信等到填好坑的那一天我一定会有所提升。
作为一名android开发,如果公司让你去面试求职者,你都会问哪些问题呢。当公司安排我去面试一个人的时候,老实说我也不知道该问些什么,所以开坑一个面试官系列,总结一些android相关的知识。如果我是android面试官,我会问哪些问题。
一 来聊一聊Activity的生命周期吧
Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称为返回栈(Back Stack)。每当我们启动一个新的活动,它会在返回栈中入栈,并处于栈顶位置。当我们按下back键或调用finish方法去销毁一个活动时,处于栈顶的活动会出栈,这时前一个入栈的活动会重新处于栈顶。系统总是会显示处于栈顶的活动给用户。
Activity的四种状态
1 运行状态
当一个活动处于返回栈的栈顶时,就处于活动状态。
2 暂停状态
当一个活动不再处于栈顶,但是仍然可见时,活动就进入了暂停状态。
3 停止状态
当一个活动不再处于栈顶位置,并且完全不可见的时候,就处于停止状态。
4 销毁状态
当一个活动从返回栈中移除,就变成了销毁状态。
Activity中定义了7个回调方法,覆盖了活动的生命周期每一个环节。
1 onCreate 此方法会在第一次创建活动时调用,应该在里面完成初始化操作,如加载布局等等。
2 onStart 这个方法在活动由不可见变为可见时调用
3 onResume 这个方法在活动准备好和用户交互时调用,此时活动一定处于栈顶,并处于运行状态。
4 onPause 这个方法在活动准备启动或恢复另一个活动时调用。
5 onStop 这个方法在活动变为完全不可见时调用
6 onDestroy 这个方法在活动被销毁前调用,之后活动状态变为销毁。
7 onRestart 这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。
活动在onCreate和onDestroy方法之间经历的叫做完整生存期。
活动在onStart和onStop之间经历的叫可见生存期
活动在onResume和onPause方法之间经历的叫前台生存期
顺带一提,有些时候我们想保证一些重要信息,在活动不慎被系统回收后创建时保存,可以使用onSaveInstanceState方法,将信息存在bundle中。在下一次活动创建时,可以取到这些信息恢复。
二 既然聊到这,在说说Activity的启动模式。
活动的启动模式一共有四种,分别是standard,singleTop,singleTask和singleInstance。可以在AndroidManifest.xml文件中通过给activity标签指定launchMode来设置。
1 standard 模式
此模式是activity的默认启动模式。此模式下每启动一个活动,都会在返回栈中入栈,并处于栈顶位置。使用此模式的活动,当需要创建时,系统不会检查之前是否创建过,每次都创建一个新的。
2 singleTop 模式
此模式下,当系统发现活动已经在栈顶,创建一个新活动时,就会直接用栈顶的活动。但是当活动不处于栈顶时,创建时仍然会创建新的活动实例。
3 singleTask 模式
使用此模式可以很好地解决反复创建的问题。但是此模式使用时需要注意,当活动不处于栈顶时,再次创建活动时会直接将活动推至栈顶,并且将此活动之上的所有活动出栈。
4 singleInstance 模式
此模式不同于以往三个模式。此模式下会启用一个新的返回栈来管理这个活动。此模式可以用于其他程序相与当前程序共享这个活动实例时使用。
三 Intent显示和隐式的区别
Intent有多个构造函数,我们使用最常见的Intent构造函数,传入所需参数,再将intent传入Activty类中提供的startActivity方法中就能启动活动了。这种新建Intent调用startActivity的方法称为显示调用。
那么隐式Intent是什么。通过AndroidManifest文件中,activity标签下配置intent-filter内容,可以指定当前活动能够响应的action和category。在action标签中我们指明当前活动可以响应的action,而category中包含了一些附加信息,更精确的指明了活动能响应的的Intent中还可能带有的category。只有action和category中的内容同时能够匹配上Intent中的对应参数时,活动才能响应Intent。
除此之外,我们还可以在intent-filter中再配置一个data标签,用于更精确的指定当前活动能够响应的Intent。data标签中可以配置一下内容。scheme,用于指定数据的协议部分。host,用于指定数据的主机名部分。port,用于指定数据的端口部分。path,用于指定主机名和端口之后的部分。mimeType,用于指定可以处理的数据类型。只有data标签中指定的内容和Intent中携带的data完全一致时才能能够响应。