2019校招Android面试题解1.0(上篇)
目录
Q1:说下Activity的生命周期?
Q2:onStart()和onResume()/onPause()和onStop()的区别?
Q3:Activity A启动另一个Activity B会回调哪些方法?如果Activity B是完全透明呢?如果启动的是一个Dialog呢?
Q4:谈谈onSaveInstanceState()方法?何时会调用?
Q5:onSaveInstanceState()与onPause()的区别?
Q6:如何避免配置改变时Activity重建?
Q7:优先级低的Activity在内存不足被回收后怎样做可以恢复到销毁前状态?
Q8:说下Activity的四种启动模式?(有时会出个实际问题来分析返回栈中Activity的情况)
activity的四种启动模式区别_launchmode图文详解 查看文章
Activity生命周期全解析、四种启动模式、IntentFilter匹配规则;查看文章
a.standard:标准模式、默认模式 [ˈstændərd]
b.singleTop:栈顶复用模式
c.singleTask:栈内复用模式
d.singleInstance:单实例模式
Q10:onNewIntent()调用时机?
Q11:了解哪些Activity启动模式的标记位?
Q12:如何启动其他应用的Activity?
方式一:用action启动
方式二:用intent设置className或component的办法启动
Q13:Activity的启动过程?
Activity:是Android最核心的组件,我们在Activity的XML文件中搭建界面,展示给用户,同时与用户进行交互。
首先了解Activity的四种状态
4种状态中,Running状态和Paused状态是可见的,Stopped状态和Killed状态时不可见的。
onCreate():
onStart():
onResume():
onPause():
onStop():
onDestroy():
onRestart():
不难看出,其实这些方法都是两两对应的,onCreate创建与onDestroy销毁;onStart可见与onStop不可见;onResume可编辑(即焦点)与onPause;这6个方法是相对应的,那么就只剩下一个onRestart方法了,这个方法在什么时候调用呢?答案就是:在Activity被onStop后,但是没有被onDestroy,在再次启动此Activity时就调用onRestart(而不再调用onCreate)方法;如果被onDestroy了,则是调用onCreate方法。
应用中的每一个Activity都是进行不同的事物处理。以邮件客户端为例,InboxActivity目的就是为了展示收件箱,这个Activity不建议创建成多个实例。而ComposeMailActivity则是用来撰写邮件,可以实例化多个此Activity对象。合理地设计Activity对象是否使用已有的实例还是多次创建,会使得交互设计更加良好,也能避免很多问题。至于想要达到前面的目标,就需要使用今天的Activity启动模式。
Android对Activity的管理:Android采用Task来管理多个Activity,当我们启动一个应用是,Android就会为其创建一个Task,然后启动这个应用的入口Activity (即 < intent-filter…/>)中配置的MAIN和LAUNCHER)。
可以把Task理解为任务栈,Task以栈的形式管理Activity:先入后出。通过调用Activity的getTaskId()的方法来获取他所在Task的ID。
launchMode在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity实例共用一个Task。
singleInstance:
第一次进入:onCreate onStart
在栈顶再次进入: onNewIntent
不在栈顶再次进入:onNewIntent onRestart onStart
按home键再次进入:onRestart onStart
按返回键:onRestart onStart
standard:
第一次进入:onCreate onStart
在栈顶再次进入: onCreate onStart
不在栈顶再次进入:onCreate onStart
按home键再次进入:onRestart onStart
按返回键:onRestart onStart
singleTop:
第一次进入:onCreate onStart
在栈顶再次进入:onNewIntent
不在栈顶再次进入:onCreate onStart
按home键再次进入:onRestart onStart
按返回键:onRestart onStart
singleTask:
第一次进入:onCreate onStart
在栈顶再次进入:onNewIntent
不在栈顶再次进入:onNewIntent onRestart onStart
按home键再次进入:onRestart onStart
按返回键:onRestart onStart
Activity的四种启动模式:
1. standard
默认启动模式,每次激活Activity时都会创建Activity,并放入任务栈中,永远不会调用onNewIntent()。
2. singleTop
如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,并调用其onNewIntent(),否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例,而不会调用onNewIntent(),此时就跟standard模式一样)。
3. singleTask
如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中(此时不会调用onNewIntent())。
4. singleInstance
在一个新栈中创建该Activity实例,并让多个应用共享该栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。
当调用到onNewIntent(intent)的时候,需要在onNewIntent() 中使用setIntent(intent)赋值给Activity的Intent.否则,后续的getIntent()都是得到老的Intent。
常用标记位
(1). Intent.FLAG_ACTIVITY_NEW_TASK,是为Activity指定“singleTask”启动模式
(2). Intent.FLAG_ACTIVITY_SINGLE_TOP,是为Activity指定“singleTop”启动模式
(3). FLAG_ACTIVITY_CLEAR_TOP,如果跟singleTask启动模式一起出现,如果被启动的Activity已经存在实例,则onNewIntent方法会被回调,如果被启动的Activity采用standard模式启动,那么连同它跟它之上的Activity都要出栈,并且创建新的实例放入栈顶。
(4). FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS,新的Activity不会在最近启动的Activity的列表中保存。等同于指定属性android:excludeFromRecents="true"
1.AndroidManifest中为Activity指定启动模式
android:launchMode="singleTask"
2.通过在Intent中设置标记位来指定Activity的启动模式
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
3.两种方式的区别
优先级上第二种的优先级要高于第一种,第一种方式无法直接为Activity设置FLAG_ACTIVITY_CLEAR_TOP标识,第二种方式无法为Activity指定singleInstance模式。
在同一个应用中,大家都熟悉用Intent在Activity之间跳转。那么Intent能否再两个应用之间跳转呢。答案是肯定的。
在Android2.0 后的做如下:
app1 org.freedom.app1.HelloActivity
app2 org.freedom.app2.TestActivity
如何在app2的TestActivity调用app1的HelloActivity呢?
首先在app1的 AndroidManifest.xml中 HelloActivity声明中加入如下内容:
然后就可以调用了
TestActivity 中调用代码如下:
Intent Intent = new Intent();
intent.setClassName("org.freedom.app1", "org.freedom.app1.HelloActivity");
startActivity(intent);
查看此文
查看文章一
查看文章二
查看文章三