标签:
转眼间毕业好久了,写程序也很久了,从高中就一直写到现在好多年了啊,学习了很多东西,把之前整理的资料和知识点慢慢分享出来。这里主要总结Android可能出的面试的题目比较全面\详细,持久更新,也欢迎大家补充,纠正,批评。
请简要介绍Android的四大组件。
答案:Android系统有四种组件,这四种组件构成了Android应用的框架,然后由Intent联系这四种组件。
Android中Activity, Intent, Content Provider, Service各有什么区别。
答案:
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);
}
```
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 注册接受接受广播的意图 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。
singleTop 跟 standard 模式比较类似。唯一的区别就是,当跳转的对象是位于 栈顶的 activity(应该可以理解为用户眼前所 看到的 activity)时,程序将不会 生成一个新的 activity 实例,而是直接跳到现存于栈顶的那个 activity 实例。拿 上面的例子来说,当 Act1 为 singleTop 模式时,执行跳转后栈里面依旧只有
一个实例,如果现在按返回键程序将直接退出。
singleTask 模式和 singleInstance 模式都是只创建一个实例的。在这种模
式下,无论跳转的对象是不是位于栈顶的 activity,程序都不会生成一个新的实 例(当然前提是栈里面已经有这个实例)。这种模式相当有用,在以后的多 activity 开发中,常会因为跳转的关系导致同个页面生成多个实例,这个在用户体验上始 终有点不好,而如果你将对应的 activity 声明为 singleTask 模式,这种问题将 不复存在。在主页的 Activity 很常用
避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类 对外部对象引用导致的生命周期变化。
Context 是什么?
1、它描述的是一个应用程序环境的信息,即上下文。
2、该类是一个抽象(abstract class)类,Android 提供了该抽象类的具体实 现类(ContextIml)。
3、通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作, 例如:启动一个 Activity,发送广播,接受 Intent,信息,等。
附加一张Context继承关系图
Android Intent的使用
三大组件——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):
public TestB extents Activity
{
.........
};
public class Test extends Activity
{
......
public void switchActivity()
{
Intent i = new Intent(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,比如Uri uri = Uri.parse(http://www.google.com );
Intent i = new Intent(Intent.ACTION_VIEW,uri);手机的Intent分发过程中,会根据http://www.google.com 的scheme判断出数据类型type
手机的Brower则能匹配它,在Brower的Manifest.xml中的IntenFilter中首先有ACTION_VIEW Action,也能处理http:的type,
3、至于分类Category,一般不要去在Intent中设置它,如果你写Intent的接收者,就在Manifest.xml的Activity的IntentFilter中包含android.category.DEFAULT,这样所有不设置Category(Intent.addCategory(String c);)的Intent都会与这个Category匹配。
4、extras(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。
IntentFilter(Intent过滤器)
为什么要引入IntentFilter?
答案:对于显式Intent,它的接受者已被指定,所以系统会自动把这个Intent发给指定的组件。但是对于隐式Intent,由于并没有指定其组件名属性,所以系统不知道该把它发给哪个组件名,于是系统就直接将其发出去,算是所有的组件都有权接收,这就需要定义一个组件可以接收到哪些Intent,所以就引入了IntentFilter(Intent过滤器)。
标签:
原文地址:http://blog.csdn.net/vfush/article/details/51481127