Android 面试题总结之Android 基础
Posted fuchenxuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 面试题总结之Android 基础相关的知识,希望对你有一定的参考价值。
android 面试题总结之Android 基础(一)
转眼间毕业好久了,写程序也很久了,从高中就一直写到现在好多年了啊,学习了很多东西,把之前整理的资料和知识点慢慢分享出来。这里主要总结Android可能出的面试的题目比较全面\\详细,持久更新,也欢迎大家补充,纠正,批评。
Android四大组件简介
-
请简要介绍Android的四大组件。
答案:Android系统有四种组件,这四种组件构成了Android应用的框架,然后由Intent联系这四种组件。- Activity用来显示Android的程序界面,一个应用往往有多个界面,所以一个应用中会有多个Activity。
- Service没有界面的后台服务,会一直运行在后台。常被用来做数据处理,也可以做一些定时的任务。
- Broadcast Receiver是Android的广播接收器,在广播机制中充当广播的接受者的作用,Android中充满了各种广播,所有需要有选择地接收一些有用的广播,然后处理这些广播。
- Content Provider可直译为内容提供者,它是用在不同的应用程序之间共享数据时,可以把一个应用的数据提供给其他的应用使用。
-
Android中Activity,Intent,ContentProvider,Service各有什么区别。
答案:- Activity:活动,是最基本的android应用程序组件。一个活动就是一个单独的屏幕,每一个活动都被实现为一个独立的类,并且从活动基类继承而来。
- Intent:意图,描述应用想干什么。最重要的部分是动作和动作对应的数据。
- ContentProvider:内容提供器,android应用程序能够将它们的数据保存到文件、SQLite数据库中,甚至是任何有效的设备中。当你想将你的应用数据和其他应用共享时,内容提供器就可以发挥作用了。
- Service:服务,具有一段较长生命周期且没有用户界面的程序。
- Manifest.xml文件中主要包括哪些信息?
答案:manifest:根节点,描述了package中所有的内容。
- uses-permission:请求你的package正常运作所需赋予的安全许可。
- permission:声明了安全许可来限制哪些程序能你package中的组件和功能。
- instrumentation:声明了用来测试此package或其他package指令组件的代码。
- application:包含package中application级别组件声明的根节点。
- activity:Activity是用来与用户交互的主要工具。
- receiver:IntentReceiver能使的application获得数据的改变或者发生的操作,即使它当前不在运行。
- service:Service是能在后台运行任意时间的组件。
- provider:ContentProvider是用来管理持久化数据并发布给其他应用程序使用的组件。
Activity
- 什么是 Activity?
四大组件之一,一个用户交互界面对应一个 activity setContentView() ,// 要显示的布局 button.setOnclickLinstener
, activity 是 Context 的子类,同时实现了 window.callback 和 keyevent.callback, 可以处理与窗体用户交互的事件. 我开发常用的的有
FragmentActivitiyListActivity ,PreferenceActivity ,TabAcitivty 等… -
Activity 生命周期
Activity 从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应 的回调方法,这些回调方法包括:onCreate onStart onResume onPause onStop onDestroy其实这些方法都是两两对应的,onCreate 创建与 onDestroy 销毁;
onStart 可见与 onStop 不可见;onResume 可编辑(即焦点)与 onPause;
如果界面有共同的特点或者功能的时候,还会自己定义一个 BaseActivity. 进度对话框的显示与销毁
onCreate Activity 创建时的初始化工作 如设置页面的ContentView、接收参数等.onRestart 在Activity的onStop后重新启动时,会调用这个参数
onStart 正在启动,即将开始,没有出现在前台,还无法和用户交互,可以理解为已经初始化完成,但是处于后台我们暂时没法看见。
-
onResume 可见了并且处于激活态,处于前台。
和onStart最大的不同就是onStart是在后台已经初始化完,但是无法交互。
onPause 失去焦点不可以交互、处于后台。
onStop 即将停止,做一些稍微重量级回收类的工作
-
onDestory Activity即将被销毁,需要们做一些回收和资源释放类的工作。
提醒: 从Activity A,打开另一个Activity B,B这个Activity是在A的onPause执行后才变成可见状态的,所以为了不影响B的显示,最好不要在onPause里执行一些耗时操作,可以考虑将这些操作放到onStop里,这时B已经可见了,(意思是A ->onPause 后才 B->onCreate,onStart, onResume #转问题4)
-
如何保存 Activity 的状态?
Activity 的状态通常情况下系统会自动保存的,只有当我们需要保存额外的 数据时才需要使用到这样的功能。
一般来说, 调用 onPause()和 onStop()方法后的 activity 实例仍然存在于内 存中, activity 的所有信息和状态数据不会消失, 当 activity 重新回到前台之后, 所有的改变都会得到保留。
但是当系统内存不足时, 调用 onPause()和 onStop()方法后的 activity 可能 会被系统摧毁, 此时内存中就不会存有该 activity 的实例对象了。如果之后这个 activity 重新回到前台, 之前所作的改变就会消失。为了避免此种情况的发生, 我 们可以覆写 onSaveInstanceState()方法。
onSaveInstanceState()方法接受一 个 Bundle 类型的参数, 开发者可以将状态数据存储到这个 Bundle 对象中, 这 样即使 activity 被系统摧毁, 当用户重新启动这个 activity 而调用它的
onCreate()方法时, 上述的 Bundle 对象会作为实参传递给 onCreate()方法, 开 发者可以从 Bundle 对象中取出保存的数据, 然后利用这些数据将 activity 恢复 到被摧毁之前的状态。
需要注意的是, onSaveInstanceState()方法并不是一定会被调用的, 因为有 些场景是不需要保存状态数据的. 比如用户按下 BACK 键退出 activity 时, 用户 显然想要关闭这个 activity, 此时是没有必要保存数据以供下次恢复的, 也就是 onSaveInstanceState()方法不会被调用.
如果调用 onSaveInstanceState()方 法, 调用将发生在 onPause()或 onStop()方法之前。@Override protected void onSaveInstanceState(Bundle outState) // TODO Auto-generated method stub super.onSaveInstanceState(outState);
- 两个 Activity 之间跳转时必然会执行的是哪几个方 法?
一般情况下比如说有两个 activity,分别叫 A,B,当在 A 里面激活 B 组件的时候, A 会调用 onPause()方法,然后 B 调用 onCreate() ,onStart(), onResume()。
这个时候 B 覆盖了窗体, A 会调用 onStop()方法. 如果 B 是个透明的,或者 是对话框的样式, 就不会调用 A 的 onStop()方法。 - 横竖屏切换时 Activity 的生命周期
此时的生命周期跟清单文件里的配置有关系。
1.不设置 Activity 的 android:configChanges 时,切屏会重新调用各个生命周期默认首先销毁当前 activity,然后重新加载。 2.设置 Activity
android:configChanges=”orientation|keyboardHidden|screenSize”时,切 屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法。
通常在游戏开发, 屏幕的朝向都是写死的。 - 如何将一个 Activity 设置成窗口的样式 只需要给我们的 Activity 配置如下属性即可。
```
7. 如何退出 Activity?如何安全退出已调用多个 Activity 的 Application?
1. 通常情况用户退出一个 Activity 只需按返回键,我们写代码想退出 activity 直接调用 finish()方法就行。
2. 记录打开的 Activity:
每打开一个 Activity,就记录下来。在需要退出时,关闭每一个 Activity 即可。
//伪代码
```List<Activity> lists ;// 在 application 全局的变量里面 lists = new ArrayList<Activity>();
lists.add(this);
for(Activity activity: lists)
activity.finish();
lists.remove(this);
<div class="se-preview-section-delimiter"></div>
- 发送特定广播:
在需要结束应用时,发送一个特定的广播,每个 Activity 收到广播后,关闭 即可。//给某个 activity 注册接受接受广播的意图 registerReceiver(receiver, filter)
//如果过接受到的是 关闭 activity 的广播 activity finish()掉 -
递归退出
就调用 finish()方法 把当前的
在打开新的 Activity 时使用 startActivityForResult,然后自己加标志,在 onActivityResult 中处理,递归关闭。
5、其实 也可以通过 intent 的 flag 来实现 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一个新的 activity。 此时如果该任务栈中已经有该 Activity,那么系统会把这个 Activity 上面的所有 Activity 干掉。其实相当于给 Activity 配置的启动模式为 SingleTop。- Activity 的四种启动模式,singletop 和 singletask 区别是什么?一般书签的使用模式是 singletop,那为什么 不使用 singletask?
singleTop 跟 standard 模式比较类似。唯一的区别就是,当跳转的对象是位于 栈顶的 activity(应该可以理解为用户眼前所 看到的 activity)时,程序将不会 生成一个新的 activity 实例,而是直接跳到现存于栈顶的那个 activity 实例。拿 上面的例子来说,当 Act1 为 singleTop 模式时,执行跳转后栈里面依旧只有
一个实例,如果现在按返回键程序将直接退出。
singleTask 模式和 singleInstance 模式都是只创建一个实例的。在这种模
式下,无论跳转的对象是不是位于栈顶的 activity,程序都不会生成一个新的实 例(当然前提是栈里面已经有这个实例)。这种模式相当有用,在以后的多 activity 开发中,常会因为跳转的关系导致同个页面生成多个实例,这个在用户体验上始 终有点不好,而如果你将对应的 activity 声明为 singleTask 模式,这种问题将 不复存在。在主页的 Activity 很常用- Android 中的 Context, Activity,Appliction 有 什么区别?
相同:Activity 和 Application 都是 Context 的子类。
Context 从字面上理解就是上下文的意思,在实际应用中它也确实是起到了管理 上下文环境中各个参数和变量的总用,方便我们可以简单的访问到各种资源。
不同:维护的生命周期不同。Context 维护的是当前的 Activity 的生命周期, Application 维护的是整个项目的生命周期。使用 context 的时候,小心内存泄露,防止内存泄露,注意一下几个方面: - 不要让生命周期长的对象引用 activity context,即保证引用 activity 的对 象要与 activity 本身生命周期是一样的。
- 对于生命周期长的对象,可以使用 application,context。
避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类 对外部对象引用导致的生命周期变化。
Context 是什么?
1、它描述的是一个应用程序环境的信息,即上下文。
2、该类是一个抽象(abstract class)类,Android 提供了该抽象类的具体实 现类(ContextIml)。
3、通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作, 例如:启动一个 Activity,发送广播,接受 Intent,信息,等。
附加一张Context继承关系图
Intent 详解
-
AndroidIntent的使用
三大组件——Activity、Service和Broadcast Receiver都是被什么激活的?
答案:Intent是一种运行时绑定的消息机制,而三大组件——Activity、Service和Broadcast Receiver都是被消息激活的,这种消息就是Intent。
一个Intent对象包括六个属性,请一一列举这六个属性。
答案:组件名(Component Name)、动作(Action)、数据(Data)、分类(Category)、额外信息(Extra)和标志(Flags)。答案:在一个Android应用中,主要是由一些组件组成,(Activity,Service,ContentProvider,etc.)在这些组件之间的通讯中,由Intent协助完成。
正如网上一些人解析所说,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。Intent在这里起着实现调用者与被调用者之间的解耦作用。
Intent传递过程中,要找到目标消费者(另一个Activity,IntentReceiver或Service),也就是Intent的响应者,有两种方法来匹配:1、显示匹配(Explicit):
publicTestBextentsActivity
.........
;
publicclassTestextendsActivity
......
publicvoidswitchActivity()
Intenti=newIntent(Test.this,TestB.class);
this.startActivity(i);
代码简洁明了,执行了switchActivity()函数,就会马上跳转到名为TestB的Activity中。2、隐式匹配(Implicit):
隐式匹配,首先要匹配Intent的几项值:Action,Category,Data/Type,Component
如果填写了Componet就是上例中的Test.class)这就形成了显示匹配。所以此部分只讲前几种匹配。匹配规则为最大匹配规则,1、如果你填写了Action,如果有一个程序的Manifest.xml中的某一个Activity的IntentFilter段中定义了包含了相同的Action那么这个Intent就与这个目标Action匹配,如果这个Filter段中没有定义Type,Category,那么这个Activity就匹配了。但是如果手机中有两个以上的程序匹配,那么就会弹出一个对话可框来提示说明。
Action的值在Android中有很多预定义,如果你想直接转到你自己定义的Intent接收者,你可以在接收者的IntentFilter中加入一个自定义的Action值(同时要设定Category值为”android.intent.category.DEFAULT”),在你的Intent中设定该值为Intent的Action,就直接能跳转到你自己的Intent接收者中。因为这个Action在系统中是唯一的。
2、data/type,你可以用Uri来做为data,比如Uriuri=Uri.parse(http://www.google.com);
Intenti=newIntent(Intent.ACTION_VIEW,uri);手机的Intent分发过程中,会根据http://www.google.com的scheme判断出数据类型type
手机的Brower则能匹配它,在Brower的Manifest.xml中的IntenFilter中首先有ACTION_VIEWAction,也能处理http:的type,3、至于分类Category,一般不要去在Intent中设置它,如果你写Intent的接收者,就在Manifest.xml的Activity的IntentFilter中包含android.category.DEFAULT,这样所有不设置Category(Intent.addCategory(Stringc);)的Intent都会与这个Category匹配。
4、extras(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。
IntentFilter(Intent过滤器)
为什么要引入IntentFilter?
答案:对于显式Intent,它的接受者已被指定,所以系统会自动把这个Intent发给指定的组件。但是对于隐式Intent,由于并没有指定其组件名属性,所以系统不知道该把它发给哪个组件名,于是系统就直接将其发出去,算是所有的组件都有权接收,这就需要定义一个组件可以接收到哪些Intent,所以就引入了IntentFilter(Intent过滤器)。
``
//给某个 activity 注册接受接受广播的意图 registerReceiver(receiver, filter)
3. 发送特定广播:
在需要结束应用时,发送一个特定的广播,每个 Activity 收到广播后,关闭 即可。
//如果过接受到的是 关闭 activity 的广播 activity finish()掉`
4. 递归退出
就调用 finish()方法 把当前的
在打开新的 Activity 时使用 startActivityForResult,然后自己加标志,在 onActivityResult 中处理,递归关闭。
5、其实 也可以通过 intent 的 flag 来实现 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一个新的 activity。 此时如果该任务栈中已经有该 Activity,那么系统会把这个 Activity 上面的所有 Activity 干掉。其实相当于给 Activity 配置的启动模式为 SingleTop。
-
Activity 的四种启动模式,singletop 和 singletask 区别是什么?一般书签的使用模式是 singletop,那为什么 不使用 singletask?
singleTop 跟 standard 模式比较类似。唯一的区别就是,当跳转的对象是位于 栈顶的 activity(应该可以理解为用户眼前所 看到的 activity)时,程序将不会 生成一个新的 activity 实例,而是直接跳到现存于栈顶的那个 activity 实例。拿 上面的例子来说,当 Act1 为 singleTop 模式时,执行跳转后栈里面依旧只有
一个实例,如果现在按返回键程序将直接退出。
singleTask 模式和 singleInstance 模式都是只创建一个实例的。在这种模
式下,无论跳转的对象是不是位于栈顶的 activity,程序都不会生成一个新的实 例(当然前提是栈里面已经有这个实例)。这种模式相当有用,在以后的多 activity 开发中,常会因为跳转的关系导致同个页面生成多个实例,这个在用户体验上始 终有点不好,而如果你将对应的 activity 声明为 singleTask 模式,这种问题将 不复存在。在主页的 Activity 很常用 -
Android 中的 Context, Activity,Appliction 有 什么区别?
相同:Activity 和 Application 都是 Context 的子类。
Context 从字面上理解就是上下文的意思,在实际应用中它也确实是起到了管理 上下文环境中各个参数和变量的总用,方便我们可以简单的访问到各种资源。
不同:维护的生命周期不同。Context 维护的是当前的 Activity 的生命周期, Application 维护的是整个项目的生命周期。使用 context 的时候,小心内存泄露,防止内存泄露,注意一下几个方面:- 不要让生命周期长的对象引用 activity context,即保证引用 activity 的对 象要与 activity 本身生命周期是一样的。
- 对于生命周期长的对象,可以使用 application,context。
- 避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类 对外部对象引用导致的生命周期变化。
-
Context 是什么?
1、它描述的是一个应用程序环境的信息,即上下文。
2、该类是一个抽象(abstract class)类,Android 提供了该抽象类的具体实 现类(ContextIml)。
3、通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作, 例如:启动一个 Activity,发送广播,接受 Intent,信息,等。附加一张Context继承关系图
Intent 详解
-
AndroidIntent的使用
三大组件——Activity、Service和Broadcast Receiver都是被什么激活的?
答案:Intent是一种运行时绑定的消息机制,而三大组件——Activity、Service和Broadcast Receiver都是被消息激活的,这种消息就是Intent。
一个Intent对象包括六个属性,请一一列举这六个属性。
答案:组件名(Component Name)、动作(Action)、数据(Data)、分类(Category)、额外信息(Extra)和标志(Flags)。答案:在一个Android应用中,主要是由一些组件组成,(Activity,Service,ContentProvider,etc.)在这些组件之间的通讯中,由Intent协助完成。
正如网上一些人解析所说,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。Intent在这里起着实现调用者与被调用者之间的解耦作用。
Intent传递过程中,要找到目标消费者(另一个Activity,IntentReceiver或Service),也就是Intent的响应者,有两种方法来匹配:1、显示匹配(Explicit):
publicTestBextentsActivity
.........
;
publicclassTestextendsActivity
......
publicvoidswitchActivity()
Intenti=newIntent(Test.this,TestB.class);
this.startActivity(i);
代码简洁明了,执行了switchActivity()函数,就会马上跳转到名为TestB的Activity中。2、隐式匹配(Implicit):
隐式匹配,首先要匹配Intent的几项值:Action,Category,Data/Type,Component
如果填写了Componet就是上例中的Test.class)这就形成了显示匹配。所以此部分只讲前几种匹配。匹配规则为最大匹配规则,1、如果你填写了Action,如果有一个程序的Manifest.xml中的某一个Activity的IntentFilter段中定义了包含了相同的Action那么这个Intent就与这个目标Action匹配,如果这个Filter段中没有定义Type,Category,那么这个Activity就匹配了。但是如果手机中有两个以上的程序匹配,那么就会弹出一个对话可框来提示说明。
Action的值在Android中有很多预定义,如果你想直接转到你自己定义的Intent接收者,你可以在接收者的IntentFilter中加入一个自定义的Action值(同时要设定Category值为”android.intent.category.DEFAULT”),在你的Intent中设定该值为Intent的Action,就直接能跳转到你自己的Intent接收者中。因为这个Action在系统中是唯一的。
2、data/type,你可以用Uri来做为data,比如Uriuri=Uri.parse(http://www.google.com);
Intenti=newIntent(Intent.ACTION_VIEW,uri);手机的Intent分发过程中,会根据http://www.google.com的scheme判断出数据类型type
手机的Brower则能匹配它,在Brower的Manifest.xml中的IntenFilter中首先有ACTION_VIEWAction,也能处理http:的type,3、至于分类Category,一般不要去在Intent中设置它,如果你写Intent的接收者,就在Manifest.xml的Activity的IntentFilter中包含android.category.DEFAULT,这样所有不设置Category(Intent.addCategory(Stringc);)的Intent都会与这个Category匹配。
4、extras(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。
IntentFilter(Intent过滤器)
为什么要引入IntentFilter?
答案:对于显式Intent,它的接受者已被指定,所以系统会自动把这个Intent发给指定的组件。但是对于隐式Intent,由于并没有指定其组件名属性,所以系统不知道该把它发给哪个组件名,于是系统就直接将其发出去,算是所有的组件都有权接收,这就需要定义一个组件可以接收到哪些Intent,所以就引入了IntentFilter(Intent过滤器)。
以上是关于Android 面试题总结之Android 基础的主要内容,如果未能解决你的问题,请参考以下文章