《Android程序员面试笔试宝典》黄建红,楚秦编|(epub+azw3+mobi+pdf)电子书下载

图书名称:《Android程序员面试笔试宝典》

【作 者】黄建红,楚秦编
【页 数】 282
【出版社】 北京:机械工业出版社 , 2021.03
【ISBN号】978-7-111-67526-6
【分 类】移动终端-应用程序-程序设计
【参考文献】 黄建红,楚秦编. Android程序员面试笔试宝典. 北京:机械工业出版社, 2021.03.

图书封面:

图书目录:

《Android程序员面试笔试宝典》内容提要:

本书覆盖了Android开发中的各个主要方面,所给出的试题均取材于各大IT公司的Android面试真题。全书分为Java部分与Android部分。因为Android开发是用Java语言来编写的,所以这里所讲的Java知识都是基础方面,而且跟Android开发有关的其他基础知识都会在Java部分进行讲解。而Android部分,则从面试中经常考的知识点入手,对Android进行全面的学习,对常见面试真题进行分析与讲解,培养读者解决面试题思路的同时,也能系统学习到Android开发。 本书内容丰富,讲解思路清晰且详细,涵盖的知识点非常多,不但是一本用来解决程序员面试的Android实用工具书,也是一本适合任何Android开发者学习的好书。

《Android程序员面试笔试宝典》内容试读

第1章四大组件

四大组件是Android面试过程中问得最多的知识点,在实际开发中也是无处不在的,因此是必须要掌握的重点知识点之一。Android的四大组件分别是活动(Activity)、服务(Service)、广播接收器(Broadcast)和内容提供者(ContentProvider)。

活动:活动即点击一个Ap叩进去后用户能够看到的界面的组件并且用户可以通过触碰点击页面的各种按钮组件来与活动进行交互。

服务:服务在后台中一直运行,甚至当应用退出后也能继续运行。

广播接收器:可以接收系统和其他应用发送过来的广播消息;同样地,它也能向系统和其他应用发送广播消息。

内容提供者:应用之间进行数据交互的桥梁,为数据提供了供外部访问的各种接口。接下来本章将会重点介绍它们。

1.1活动

尽管在面试过程中对活动(Activity)的问法各式各样,但还是离不开3个方面:生命周期、启动模式和碎片(Fragment)。

1.1.1生命周期

Activity的生命周期是必须要掌握的知识点,如图1.1所示。

1)每个方法代表一个阶段,当点击手机系统桌面中的某个应用时,Activity启动,生命周期从开始一直到结束,会依次执行onCreate(、onStart(0、onResume()、onPause()、onStop()、onDestroy(和onRestart()这些方法:

2)onCreate(),Activity第一次被创建的时候调用,通常在该方法里进行一些初始化操作,例如加载布局、组件和绑定事件等:

3)onStartO,当Activity创建完后,此时由不可见状态变成可见状态,调用onStartO:4)onResume(),处于运行状态(Activity位于工作栈栈顶)时调用,用户可进行触碰点击页面上的各种按钮,从而与活动进行交互:

5)onPause(),当前Activity去启动其他活动时会调用,例如Activity在运行中,用户点击某个按钮触发了一个对话框的活动弹出,此时Activity处于暂停状态,触发onPause(),但

Activity并不是完全不可见的:

6)onStopO,Activity处于完全不可见状态就调用,注意跟onPause(的区别:7)onDestroy(,Activity销毁前调用,调用之后Activity就会被销毁:

8)onRestart(),当Activity重新被启动时调用,由停止状态变为可见状态,然后继续运行。

Android程序员面试笔试宝典

启动Activity

onCreate()

onStart()

onResume()

返回上一个Activity(回到前台)】

onResume()

杀死进程

Activity:运行中

当另一个Activity进人前台

当其他优先级更高的

返回上一个Activit0y(回到前台)

应用需要内存时

onPause()

当Activity不可见

返回上一个Activity(回到前台)

onStop()

销段Activit

onDestroy()

关闭Activity

图1.1 Activity生命周期

1.1.2启动模式

启动模式的意思就是一个Activity是以怎样的一种启动方式来跳转到当前页。设置启动模式的方法也有两种。第一种用得比较多:在配置文件AndroidManifest..xml里用android:launchMode来指定,有四种模式可指定,分别是standard、singleTop、singleTask和singleInstance。这四种模式将在本节中逐一详细讲解:第二种设置方式则是通过在Intent中设置标记位来指定启动模式。

在讲解启动模式之前,还需要知道“任务栈”的概念。什么是任务栈?任务栈,即Tsk,它是一种用来保存和管理Activity的数据结构,也是所有Activity的集合。它遵循“后进先出”规则,假如当前页是ActivityA,点击按钮启动ActivityB,此时ActivityB就入栈,处于栈顶位置,而ActivityA则位于ActivityB之下,所以当前页就跳转为ActivityB了。这就是正常的启动模式,而往往实际开发中有时并不会只想要正常的启动模式,这时就需要用到上文提到的两种方式来指定其他启动模式了,尤其是第一种方式的四种模式是最常用的。

(1)standard

标准模式,如果不指定android::launchMode,默认就是standard模式。它就是常说的正常情况下的模式,每次启动一个活动时,就会创建一个实例,然后被启动的活动入栈,并处于栈顶的位置。

2

第1章四大组件

下面通过代码来实现standard模式,在MainActivity的onCreate(方法里用Intent来实现跳转,而这里决定让MainActivity要跳转的活动是自己,因为这样能更好地看出在standard模式下活动是怎样启动的:

protected void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState):

setContentView(R.layout.activity main);打印类信息,确定是否创建新的实例

Log.d(TAG,"onCreate:"+getClass0.getSimpleName()+this.toString();

Button buttonl findViewByld(R.id.button1):

buttonl.setOnClickListener(new View.OnClickListener({@Override

public void onClick(View view)

Intent intent new Intent(MainActivity.this

MainActivity.class)startActivity(intent);

然后连续点击按钮3次,打印结果如下:

onCreate:MainActivitycom.example.pingred.launchmodetest.MainActivity@3492d55onCreate:MainActivitycom.example.pingred.launchmodetest.MainActivity@923983bonCreate:MainActivitycom.example.pingred.launchmodetest.MainActivity@a99d01b

从运行结果可以看出,MainActivity的确是被创建了3个实例,每启动一次,就创建一个新实例。

(2)singleTop

在该模式下启动Activity,系统会先检查任务栈栈顶是否有该Activity实例,如果有则直接使用它,调用onNewIntentO)方法:如果没有则创建新的实例并且入栈到栈顶。设置该模式的方法就是在AndroidManifest..xml文件里用android:launchMode来指定:

MainActivity..java里的代码不变,运行程序,然后再次连续点击3次跳转按钮,打印结果如下:

onCreate:MainActivitycom.example.pingred.launchmodetestMainActivity@3b6395

从运行结果可以看出,不管按多少点跳转按钮,MainActivity只有一个实例,因为它在栈项位置了,只需直接使用它就可以,不需要创建新的实例。

(3)singleTask

经过上文讲解,可以知道singleTop是栈顶复用活动实例:活动A设置了singleTop模式,

当活动A启动活动B,然后活动B再启动回活动A时,因为此时处于栈顶位置的是活动B而

不是活动A,所以还是会创建新的活动A实例,这是singleTop模式的效果。但是如果实际开

发中有需求是要求整个应用就只存在活动A一个实例,不管怎么启动,都只使用这一个实例,

3

Android程序员面试笔试宝典

那又该如何实现呢?所以此时就需要设置singleTask模式了:

然后创建另一个活动类BActivity,用它来启动MainActivity:

protected void onCreate(@Nullable Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity b);灯印类信息,确定是否创建新的实例

Log.d(TAG,"onCreate:"+getClassO.getSimpleName(+this.toStringO);

Button button2 findViewByld(R.id.button2);

button2.setOnClickListener(new View.OnClickListener({

@Override

public void onClick(View view)

Intent intent=new Intent(BActivity.this,MainActivity.class):startActivity(intent);

})方

最后MainActivity改为启动BActivity:

Intent intent=new Intent(MainActivity.this,BActivity.class):startActivity(intent);

运行程序后,先点击MainActivity的按钮启动BActivity,然后再点击BActivity的按钮启动MainActivity,打印的结果如下:

MainActivity:onCreate:MainActivitycom.example.pingred.rxjavatest.MainActivity@3b6395BActivity:onCreate:BActivitycom.example.pingred.rxjavatest.BActivity@6b6636a

从运行结果可以看出,当在BActivity里点击按钮启动了MainActivity后,并没有创建新的MainActivity实例,这就是singleTask模式的作用了。

这里要再介绍一个知识点就是taskAf衎inity属性。该属性跟singleTask是密切相关的,因为其实该模式下启动活动时,最先开始还有一个任务栈匹配的过程,就是会先根据需要的任务栈里找活动实例,而这个需要的任务栈就是通过taskAffinity属性来指定的。当然也可以不指定,这样就默认为askAffinity值为包名。

所以,最后来总结一下singleTask模式:如果是在同一个应用中(taskAffinity值一样)启动Activity时,系统先检测任务栈中是否存在该Activity,如果存在则直接使用该活动实例,让它置于栈顶,而它之上的其他活动纷纷出栈。如果不存在该实例,则创建该活动新的实例,置于栈顶。如果不是在同一应用中(taskAffinity值不一样),而是其他应用中来启动该模式下的Activity时,那么系统会创建一个新的任务栈,创建该活动新的一个实例,将它置于该新建任务栈栈顶。

(4)singleInstance

在该模式下启动Activity时,系统会先创建一个新的任务栈来专门存储与管理该Activity,

A

第1章四大组件

而且该Activity具有全局唯一性,也就是该任务栈中只有这个Activity实例,任何应用只要启动该Activity,用的都是这一个实例。下面用代码实现该模式下的效果,先把MainActivity设置为singlelnstance模式:

然后把MainActivity的任务栈id打印出来:

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState):

setContentView(R.layout activity main);

打印类信息和其任务栈d,确定是否创建新的实例

Log.d(TAG,"onCreate:"+getClass(.getSimpleName(0+"任务栈id为:"+getTaskIdO);

Button buttonl=findViewById(Rid.button1);

button1.setOnClickListener(new View.OnClickListenerO

@Override

public void onClick(View view){

Intent intent=new Intent(MainActivity.this,BActivity.class);startActivity(intent);

接着也把BActivity的任务栈id打印出来,最后运行程序,在MainActivity页面里点击按钮跳转启动BActivity,然后在BActivity页面里点击按钮跳转启动MainActivity,打印的结果如下:

07-25 18:57:08.274 5977-5977/com.example.pingred.launchmodetest D/MainActivity:onCreate:MainActivity id:907-2518:57:l4.1515977-5977 /com.example.pingred.launchmodetest D/BActivity:onCreate:BActivity任务栈id为:10从运行结果可以看出,两个活动各自所处的任务栈是不一样的,而且最后MainActivity也只有一个实例,这就是singleInstance模式的作用了。

1.1.3碎片

碎片(Fragment)其实是Activity的缩小版,它与Activity类似,可以显示各种组件与布局的页面,使用起来灵活性高,也便于复用。

Fragment的生命周期也跟Activity的生命周期类似,如图1.2所示。

I)Fragment与Activity关联时,onAttach(执行,Fragment的生命周期开始;2)Fragment加载布局时,onCreateView(执行:

3)与Fragment相关联的Activity创建完时,onActivityCreated(执行;4)与Fragment关联的布局被移除时,onDestroyView(执行;5)Fragment与Activity解除关联时,onDetach(执行:

6)其他方法跟活动的生命周期方法一样,这里就不做解释了。

5

Android程序员面试笔试宝典

Activity状态

Fragment生命周期方法

created

onAttach()

onCreate()

onCreateView()

onActivityCreated()

started

onStart()

resumed

onResume()

paused

onPause()

stopped

onStop()

destroyed

onDestroy View()

onDestroy()

onDetach()

图1.2 Fragment生命周期

1.1.4常见面试笔试真题

1)请描述一下Activity生命周期及其各方法。思路

遇到此类问生命周期的题第一时间是要先想到Activity的一个完整的生命周期是怎样的,然后再具体到每个阶段的方法又是怎样的。

解答:

一个Activity的完整生命周期是:

onCreate(→onStart(0→onResume(→onPause()→onStopO→onDestroy().

●onCreate(:Activity第一次被创建的时候调用,通常在该方法里进行一些初始化操作,例如加载布局、组件和绑定事件等:

●onStartO:当Activity创建完后,此时由不可见状态变成可见状态,调用onStartO):

●onResume(:处于运行状态(Activity位于工作栈栈顶)时调用,用户可进行触碰点击页面上的各种按钮,从而与活动进行交互:

●onPause0):当前Activity去启动其他活动时会调用,例如Activity在运行中,用户点

6

···试读结束···

阅读剩余
THE END