搜档网
当前位置:搜档网 › 整理的最全面的android面试题-可以按照这个学习android

整理的最全面的android面试题-可以按照这个学习android

整理的最全面的android面试题-可以按照这个学习android
整理的最全面的android面试题-可以按照这个学习android

Android的四大组件是哪些,它们的作用?

答:Activity : Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很多持久化的事情,妥善管理生命周期以及一些跳转逻辑

service :后台服务于Activity,封装有一个完整的功能逻辑实现,接受上层指令,完成相关的食物,定义好需要接受的Intent提供同步和异步的接口

Content Provider :是Android提供的第三方应用数据的访问方案,可以派生Content Provider类,对外

提供数据,可以像数据库一样进行选择排序,屏蔽内部数据的存储细节,向外提供统一的借口模型,大大简化上层应用,对数据的整合提供了更方便的途径

Broadcast Receiver :接受一种或者多种Intent作触发事件,接受相关消息,做一些简单处理,转换成一条Notification,统一了Android的事件广播模型

e 必调用的三个方法:onCreate() --> onStart() --> onResume(),用AAA 表示

(1 )父Activity启动子Activity,子Actvity退出,父Activity调用顺序如下

AAA --> onFreeze() --> onPause() --> onStop() --> onRestart() --> onStart(),onResume() …

(2 )用户点击Home,Actvity调用顺序如下

AAA --> onFreeze() --> onPause() --> onStop() -- Maybe --> onDestroy() - Maybe

(3)调用finish(),Activity调用顺序如下

AAA --> onPause() --> onStop() --> onDestroy()

(4)在Activity上显示dialog,Activity调用顺序如下

AAA

(5)在父Activity上显示透明的或非全屏的activity,Activity调用顺序如下

AAA --> onFreeze() --> onPause()

(6)设备进入睡眠状态,Activity调用顺序如下

AAA --> onFreeze() --> onPause()

如果后台的Activity 由于某原因被系统回收了,如何在被系统回收之前保存当前状态?

onSavelnstanceState()

当你的程序中某一个Activity A在运行时,主动或被动地运行另一个新的Activity B,这个时候A

会执行onSavelnstanceState() 。B完成以后又会来找A,这个时候就有两种情况:一是A被回收,二是

A没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上

了参数savedInstanceState ;而没被收回的就直接执行onResume(),跳过onCreate() 了。

3. 如何将一个Activity 设置成窗口的样式。

在AndroidManifest.xml 中定义Activity 的地方一句话android:theme="@android:style/Theme.Dial og"或

android:theme="@android:style/Theme.Translucent" 就变成半透明的

4. 如何退出Activity ?如何安全退出已调用多个Activity 的Application ?

对于单一Activity 的应用来说,退出很简单,直接finish() 即可。

当然,也可以用killProcess() 和System.exit() 这样的方法。

但是,对于多Activity 的应用来说,在打开多个Activity 后,如果想在最后打开的Activity 直接退出

,上边的方法都是没有用的,因为上边的方法都是结束一个Activity 而已。

在 2.1 之前,可以使用ActivityManager 的restartPackage 方法。

它可以直接结束整个应用。在使用时需要权限android.permission.RESTART_PACKAGES。

注意不要被它的名字迷惑。

可是,在22,这个方法失效了。

在 2.2 添加了一个新的方法,killBackgroundProcesses(),需要权限android.permission.KILL_BACKGR

OUND_PROCESSES

可惜的是,它和2.2的restartPackage 一样,根本起不到应有的效果。

另外还有一个方法,就是系统自带的应用程序管理里,强制结束程序的方法,forceStopPackage()。

它需要权限android.permission.FORCE_STOP_PACKAGES

并且需要添加I android:sharedUserld="android.uid.system" 属性

同样可惜的是,该方法是非公开的,他只能运行在系统进程,第三方程序无法调用。

因为需要在Android.mk 中添加LOCAL_CERTIFICAT匡platform。

而Android.mk是用于在Android源码下编译程序用的。

从以上可以看出,在2.2,没有办法直接结束一个应用,而只能用自己的办法间接办到。

现提供几个方法,供参考:

1、抛异常强制退出:

该方法通过抛异常,使程序Force Close。

验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。

2、记录打开的Activity :

每打开一个Activity ,就记录下来。在需要退出时,关闭每一个Activity 即可。

3、发送特定广播:

在需要结束应用时,发送一个特定的广播,每个Activity 收到广播后,关闭即可。

4、递归退出

在打开新的Activity 时使用startActivityForResult ,然后自己加标志,在onActivityResult 中处理

,递归关闭。

除了第一个,都是想办法把每一个Activity 都结束掉,间接达到目的。

但是这样做同样不完美。

你会发现,如果自己的应用程序对每一个Activity 都设置了nosensor,在两个Activity 结束的间隙,s

ensor可能有效了。

但至少,我们的目的达到了,而且没有影响用户使用。

为了编程方便,最好定义一个Activity 基类,处理这些共通问题。

5、请介绍下Android中常用的五种布局。

常用五种布局方式,分别是:FrameLayout (框架布局),LinearLayout (线性布局),AbsoluteL

ayout (绝对布局),RelativeLayout (相对布局),TableLayout (表格布局)。

一、FrameLayout :所有东西依次都放在左上角,会重叠,这个布局比较简单,也只能放一点比较简单的东西。

二、LinearLayout :线性布局,每一个LinearLayout 里面又可分为垂直布局(android:orientation="v ertical")和水平布局(android:orientation="horizontal" )。当垂直布局时,每一行就只有一个元素,多

个元素依次垂直往下;水平布局时,只有一行,每一个元素依次向右排列。

三、AbsoluteLayout :绝对布局用X,Y坐标来指定元素的位置,这种布局方式也比较简单,但是在屏幕旋转时,往往会出问题,而且多个元素的时候,计算比较麻烦。

四、RelativeLayout :相对布局可以理解为某一个元素为参照物,来定位的布局方式。主要属性有:

相对于某一个元素android:layout_below、android:layout_toLeftOf 相对于父元素的地方android:la

yout_alignParentLeft 、android:layout_alignParentRigh ;

五、TableLayout :表格布局,每一个TableLayout里面有表格行TableRow,TableRow 里面可以具体定义每一个元素。每一个布局都有自己适合的方式,这五个布局元素可以相互嵌套应用,做出美观的界面。

一 .SharedPrefere nces 方式 二?文件存储方式 三. SQLite 数据库方式

四. 内容提供器(Content provider )方式 五. 网络存储方式

7.

请介绍下Contentprovider 是如何实现数据共享的。

一个程序可以通过实现一个 Content provider 的抽象接口将自己的数据完全暴露出去,而且 Conten t providers 是以类似数据库中表的方式将数据暴露。

Content providers 存储和检索数据,通过它可以让

所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。

要想使应用程序的数据公开化,可通过 2种方法:创建一个属于你自己的 Content provider 或者将

你的数据添加到一个已经存在的

Content provider 中,前提是有相同数据类型并且有写入

Content provid

er 的权限。

如何通过一套标准及统一的接口获取其他应用程序暴露的数据?

Android 提供了 ContentResolver ,外界的程序可以通过 ContentResolver 接口访问 ContentProvide r 提供的数据。 8.

如何启用Service ,如何停用Service 。

Android 中的service 类似于windows 中的service , service 一般没有用户操作界面,它运行于系统中不 容易被用户发觉,

可以使用它开发如监控之类的程序。 一。 步骤

第一步:继承 Service 类

public class SMSService extends Service {} 第二步:在 AndroidManifest.xml 文件中的节点里对服务进行配置:

二。 Context.startService()和 Context.bindService 服务不能自己运行,需要通过调用 Context.startService()或Context.bindService()方法启动服务。这两个

方法都可

以启动Service ,但是它们的使用场合有所不同。

1.

使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。 使用

bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。 2.

采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的 onCreate()方法,

接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用 startService()方法并 不会导致多次创建服务,但会导致多次调用

onStart()方法。

采用startService()方法启动的服务,只能调用

Context.stopService()方法结束服务,服务结束时会调用

onDestroy()方法。 3.

采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的 onCreate()方法,

接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的 onUnbind()方法, 。接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用 bindService()方

法并不会

导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正 在绑定的服务 解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的

onUnbind()--

>onDestroy()方法。

三。Service 的生命周期

I.Service 常用生命周期回调方法如下:

6.

请介绍下 Android

的数据存储方式。

onCreate() 该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或

bindService()方法,

服务也只被创建一次。onDestroy()该方法在服务被终止时调用。

2.Context.startService() 启动Service有关的生命周期方法

onStart() 只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。

多次调用startService()方法尽管不会多次创建服务,但onStart()方法会被多次调用。

3.Context.bindService() 启动Service有关的生命周期方法

onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,

当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。

onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用。备注:

1.采用startService()启动服务

Intent intent = new lntent(DemoActivity.this, DemoService.class);

startService(intent);

2.Context.bindService() 启动

Intent intent = new Intent(DemoActivity.this, DemoService.class);

bindService(intent, conn, Context.BIND_AUTO_CREATE);

//unbindService(conn);// 解除绑定

引入广播机制的用意。

9注册广播有几种方式,这些方式有何优缺点?请谈谈Android

Android 广播机制(两种注册方法)

在android 下,要想接受广播信息,那么这个广播接收器就得我们自己来实现了,我们可以继承

roadcastReceiver ,就可以有一个广播接受器了。有个接受器还不够,我们还得重写Broadcas tReceiver 里面的onReceiver 方法,当来广播的时候我们要干什么,这就要我们自己来实现,

两种注册类型的区别是:

1)第一种不是常驻型广播,也就是说广播跟随程序的生命周期。

2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

引入广播机制可以方便几大组件的信息和数据交互。

10. android中的动画有哪几类,它们的特点和区别是什么

答:两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小

以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好

的图片来实现,类似电影。

11

. android

中有哪几种解析xml 的类?官方推荐哪种?以及它们的原理和区别

答:XML 解析主要有三种方式,SAX 、DOM PULL 。常规在PC 上开发我们使用Dom 相对轻松些,但一些 性能敏感的数据库或手机上还是主要采用

SAX

方式,SAX 读取是单向的,优点:不占内存空间、解析属性

方便,但缺点就是对于套嵌多个分支来说处理不是很方便。而 DOM 方式会把整个XML 文件加载到内存中 去,这里Android 开发网提醒大家该方法在查找方面可以和

XPath 很好的结合如果数据量不是很大推

荐使用,而PULL 常常用在J2ME 对于节点处理比较好,类似 SAX 方式,同样很节省内存,在 J2ME 中我 们经常使用的

KXML 库来解析。 12. ListView 的优化方案

方法中要考虑方法传进来的参数 c ontentView 是否为

并返回,如果不为null 则直接使用。在这个方法中尽可能 少创建

view

2、给 contentView 设置 tag ( setTag 可以达到

图像数据异步加载的效果。

3、如果Hstview

需要显示的

item

很多,就要考虑分页加载。比如一共要显示

我们可以考虑先加载20

条,等用户拉到列表底部的时候再去加载接下来的

20

答:在android 里,有4种activity 的启动模式,分别为:

"standard ”(默认) "singleT op ”

“ singleT ask ” “singleInstance ” 它们主要有如下不同:

1.

如何决定所属task

“standard ”和” singleTop ”的activity 的目标task ,和收到的Intent 的发送者在同一个 task 内,除非 intent 包括参数 FLAG_ACTIVITY_NEW_TASK 。

如果提供了 FLAG_ACTIVITY_NEW_TASK 参数,会启动到别的 task 里。

“singleTask ”和” singleInstance ”总是把activity 作为一个task 的根元素,他们不会被启动到一个其他 task 里。

2.

是否允许多个实例

“standard ”和” singleTop ”可以被实例化多次,并且存在于不同的

task 中,且一个task 可以包括一个

activity 的多个实例;

“singleTask ”和” singleInstance ”则限制只生成一个实例,并且是 task 的根元素。singleTop 要求如 果创建intent 的时候栈顶已经有要创建 的Activity 的实例,则将intent 发送给该实例,而不发送给新的实 例。

3.

是否允许其它activity 存在于本task 内

“singleInstance ”独占一个task ,其它activity 不能存在那个task 里;如果它启动了一个新的

activity ,

不管新的activity 的launch mode 如何,新的activity 都将会到别的task 里运行(如同加了 FLAG_ACTIVITY_NEW_TASK 参数)。 而另外三种模式,则可以和其它

activity 共存。

4.

是否每次都生成新实例

“standard "对于没一个启动Intent 都会生成一个activity 的新实例; “singleT op "的activity 如果在task 的栈顶的话,则不生成新的该

activity 的实例,直接使用栈顶的实例, 否

则,生成该activity 的实例。

比如现在task 栈元素为A-B-C-D ( D 在栈顶),这时候给D 发一个启动intent ,如果D 是“standard ” 的,则生成D 的一个新实例,栈变为 A — B —C — D — D 。

如果D 是singleTop 的话,则不会生产 D 的新实例,栈状态仍为 A-B-C-D

答:1如果自定义适配器,那么在 getView

null ,如果为 null 就创建 contentView ()),传入一个 viewHolder 对象,用于缓存要显示的数据,

100

条或者更多的时候,

13.

activity 的启动模式有哪些?是什么含义?

如果这时候给B发Intent的话,不管B的launchmode 是” standard ” 还是“singleTop ” ,都会生成

B的新实例,栈状态变为A-B-C-D-B o

“singleInstance ”是其所在栈的唯一activity,它会每次都被重用。

“singleTask”如果在栈顶,则接受intent,否则,该intent会被丢弃,但是该task仍会回到前台。

当已经存在的activity实例处理新的intent时候,会调用onNewlntent()方法如果收到intent生成一个act ivity实例,那么用户可以通过back键回到上一个状态;如果是已经存在的一个activity来处理这个intent

的话,用户不能通过按back键返回到这之前的状态。

14.请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。

Handler 简介:

一个Handler允许你发送和处理Message和Runable对象,这些对象和一个线程的MessageQueue 相

关联。每一个线程实例和一个单独的线程以及该线程的MessageQueue相关联。当你创建一个新的

Handler时,它就和创建它的线程绑定在一起了。这里,线程我们也可以理解为线程的MessageQueue 。

从这一点上来看,Handler把Message和Runable对象传递给MessageQueue,而且在这些对象离开MessageQueue 时,Handler负责执行他们。

Handler有两个主要的用途:(1 )确定在将来的某个时间点执行一个或者一些Message和Runnable对

象。(2)在其他线程(不是Handler绑定线程)中排入一些要执行的动作。

Scheduling Message,即(1),可以通过以下方法完成:

post(Runnable):Runnable 在handler绑定的线程上执行,也就是说不创建新线程。

5562b

AIDL(AndRoid接口描述语言)是一种借口描述语言;编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的.如果需要在一个Activity中,访问另一个Service中的某个对

象,需要先将对象转化成AIDL可识别的参数(可能是多个参数),然后使用AIDL来传递这些参数,在消息的接收端,使用这些参数组装成自己需要的对象.

AIDL的IPC的机制和COM或CORBA类似,是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值.如果要使用AIDL,需要完成2件事情:1.引入AIDL的相关类.;2.调用aidl产生的

class.

AIDL的创建方法:

AIDL语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。由于远程调

用的需要,这些参数和返回值并不是任何类型.下面是些AIDL支持的数据类型:

1.不需要import声明的简单Java编程语言类型(int,boolean等)

2.String, CharSequence不需要特殊声明

3.List, Map和Parcelables类型,这些类型内所包含的数据成员也只能是简单数据类型,String等其他比

支持的类型.

(另外:我没尝试Parcelables,在Eclipse+ADT下编译不过,或许以后会有所支持)

15.系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由。

通过直接发送Uri把参数带过去,或者通过manifest里的intentfilter里的data属性

16.Android本身的a pi并未声明会抛出异常,则其在运行时有无可能抛出runtime 异常,你遇到

过吗?诺有的话会导致什么问题?如何解决?

答:会,比如nullpointerException 。我遇到过,比如textview.setT ext()时,textview 没有初始化。会导致程序无法正常运行出现forceclose。打开控制台查看logcat信息找出异常信息并修改程序。

17.跟activity 和Task有关的Intent启动方式有哪些?其含义?核心的Intent Flag有:

FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

FLAG_ACTIVITY_SINGLE_TOP

FLAG_ACTIVITY_NEW_TASK

如果设置,这个Activity会成为历史stack中一个新Task的开始。一个Task (从启动它的Activity到下一个Task中的Activity )定义了用户可以迁移的Activity原子组。Task可以移动到前台和后台;在某个特定Task中的所有

Activity总是保持相同的次序。

这个标志一般用于呈现“启动”类型的行为:它们提供用户一系列可以单独完成的事情,与启动它们的

Activity完全无关。

使用这个标志,如果正在启动的Activity的Task已经在运行的话,那么,新的Activity将不会启动;代

替的,当前Task会简单的移入前台。参考FLAG_ACTIVITY_MULTIPLE_TASK 标志,可以禁用这一行为。

这个标志不能用于调用方对已经启动的Activity请求结果。

FLAG_ACTIVITY_CLEAR_TOP

如果设置,并且这个Activity已经在当前的Task中运行,因此,不再是重新启动一个这个Activity的实例,而是在这个Activity上方的所有Activity都将关闭,然后这个Intent会作为一个新的Intent投递到老的Activity (现在位于顶端)中。

例如,假设一个Task中包含这些Activity : A,B,C,D。如果D调用了startActivity(),并且包含一个指向

Activity B的Intent,那么,C和D都将结束,然后B接收到这个Intent,因此,目前stack的状况是:A,B o

上例中正在运行的Activity B既可以在onNewIntent()中接收到这个新的Intent,也可以把自己关闭然后重新启动来接收这个Intent。如果它的启动模式声明为multiple "(默认值),并且你没有在这个Intent中

设置FLAG_ACTIVITY_SINGLE_TOP 标志,那么它将关闭然后重新创建;对于其它的启动模式,或者在

这个Intent中设置FLAG_ACTIVITY_SINGLE_TOP 标志,都将把这个Intent投递到当前这个实例的onNewIntent()中。

这个启动模式还可以与FLAG_ACTIVITY_NEW_TASK 结合起来使用:用于启动一个Task中的根

Activity,它会把那个Task中任何运行的实例带入前台,然后清除它直到根Activity。这非常有用,例如,

当从Notification Manager 处启动一个Activity。

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

如果设置这个标志,这个activity不管是从一个新的栈启动还是从已有栈推到栈顶,它都将以the

front door of the task的方式启动。这就讲导致任何与应用相关的栈都讲重置到正常状态(不管是正在讲activity移入还是移除),如果需要,或者直接重置该栈为初始状态。

FLAG_ACTIVITY_SINGLE_TOP

如果设置,当这个Activity位于历史stack的顶端运行时,不再启动一个新的

FLAG_ACTIVITY_BROUGHT_TO_FRONT

这个标志一般不是由程序代码设置的,如在launchMode中设置singleTask模式时系统帮你设定。

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET

如果设置,这将在Task的Activity stack中设置一个还原点,当Task恢复时,需要清理Activity。也就是说,下一次Task带着FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 标记进入前台时(典型的操作是用户在主画面重启它),这个Activity和它之上的都将关闭,以至于用户不能再返回到它们,但是可以

回到之前的Activity。

这在你的程序有分割点的时候很有用。例如,一个e-mail应用程序可能有一个操作是查看一个附件,需

要启动图片浏览Activity来显示。这个Activity应该作为e-mail应用程序Task的一部分,因为这是用户在这个Task中触发的操作。然而,当用户离开这个Task,然后从主画面选择e-mail app,我们可能希望

回到查看的会话中,但不是查看图片附件,因为这让人困惑。通过在启动图片浏览时设定这个标志,浏览及其它启动的Activity在下次用户返回到mail程序时都将全部清除。

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

如果设置,新的Activity不会在最近启动的Activity的列表中保存。

FLAG_ACTIVITY_FORWARD_RESULT

如果设置,并且这个Intent用于从一个存在的Activity启动一个新的Activity,那么,这个作为答复目标的Activity 将会传到这个新的Activity中。这种方式下,新的Activity可以调用setResult(int),并且这个结果值将发送给那个作为答复目标的Activity。

FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

这个标志一般不由应用程序代码设置,如果这个Activity是从历史记录里启动的(常按HOME键),那

么,系统会帮你设定。

FLAG_ACTIVITY_MULTIPLE_TASK

不要使用这个标志,除非你自己实现了应用程序启动器。与FLAG_ACTIVITY_NEW_TASK 结合起来使

用,可以禁用把已存的Task送入前台的行为。当设置时,新的Task总是会启动来处理Intent,而不管这是是否已经有一个Task可以处理相同的事情。

由于默认的系统不包含图形Task管理功能,因此,你不应该使用这个标志,除非你提供给用户一种方

式可以返回到已经启动的Task。

如果FLAG_ACTIVITY_NEW_TASK 标志没有设置,这个标志被忽略。

FLAG_ACTIVITY_NO_ANIMATION

如果在Intent中设置,并传递给Context.startActivity()的话,这个标志将阻止系统进入下一个Activity时

应用Acitivity迁移动画。这并不意味着动画将永不运行-------- 如果另一个Activity在启动显示之前,没有指

定这个标志,那么,动画将被应用。这个标志可以很好的用于执行一连串的操作,而动画被看作是更高一级的事件的驱动。

FLAG_ACTIVITY_NO_HISTORY

如果设置,新的Activity将不再历史stack中保留。用户一离开它,这个Activity就关闭了。这也可以通过设置noHistory特性。

FLAG_ACTIVITY_NO_USER_ACTION

如果设置,作为新启动的Activity进入前台时,这个标志将在Activity暂停之前阻止从最前方的Activity 回调的onUserLeaveHint()。

典型的,一个Activity可以依赖这个回调指明显式的用户动作引起的Activity移出后台。这个回调在

Activity的生命周期中标记一个合适的点,并关闭一些Notification。

如果一个Activity通过非用户驱动的事件,如来电或闹钟,启动的,这个标志也应该传递给

Context.startActivity,保证暂停的Activity不认为用户已经知晓其Notification。

FLAG_ACTIVITY_PREVIOUS_IS_TOP

If set and this intent is being used to launch a new activity from an existing one, the current activity will not be counted as the top activity for deciding whether the new intent should be delivered to the top instead of starting a new one. The previous activity will be used as the top, with the assumption being that the current activity will finish itself immediately.

FLAG_ACTIVITY_REORDER_TO_FRONT

如果在Intent中设置,并传递给Context.startActivity(),这个标志将引发已经运行的Activity移动到历史stack的顶端。

例如,假设一个Task由四个Activity组成:A,B,C,D。如果D调用startActivity()来启动Activity B,那么,B会移动到历史stack的顶端,现在的次序变成A,C,D,B。如果

FLAG_ACTIVITY_CLEAR_TOP 标志也设置的话,那么这个标志将被忽略

在屏幕旋转时的生命周期

18. activity

答:不设置Activity的android:configChanges 时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次;设置Activity的android:configChanges="orientation" 时,切屏还是会重新调用各

个生命周期,切横、竖屏时只会执行一次;设置Activity的android:configChanges="orientation|keyboardHidden" 时,切屏不会重新调用各个生命周期,只会执行

onConfigurationChanged 方法

19 你如何评价Android系统?优缺点。

答:Android平台手机5大优势:

一、开放性

在优势方面,Android平台首先就是其开发性,开发的平台允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟。开放性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,随大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机。二、挣脱运营商的束缚

在过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制。从去年iPhone上市,用户可以更加方便地连接网络,运营商的制约减少。

随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提升,手机随意接入网络已不是运营商口中的笑谈,当你可以通过手机IM软件方便地进行即时聊天时,再回想不久前天价的彩信和图铃下载业务,是不是像噩梦一样?互联网巨头

Google推动的Android终端天生就有网络特色,将让用户离互联网更近。

三、丰富的硬件选择

这一点还是与Android平台的开放性相关,由于Android的开放性,众多的厂商会推出千奇百怪,功能特

色各具的多种产品。功能上的差异和特色,却不会影响到数据同步、甚至软件的兼容,好比你从诺基亚

Symbian风格手机一下改用苹果iPhone,同时还可将Symbian中优秀的软件带到iPhone上使用、联系人等资料更是可以方便地转移,是不是非常方便呢?

四、不受任何限制的开发商

Android平台提供给第三方开发商一个十分宽泛、自由的环境,不会受到各种条条框框的阻扰,可想而知,会有多少新颖别致的软件会诞生。但也有其两面性,血腥、暴力、情色方面的程序和游戏如可控制正是留给Android难题之一。

五、无缝结合的Google应用

如今叱诧互联网的Google已经走过10年度历史,从搜索巨人到全面的互联网渗透,Google服务如地图、

邮件、搜索等已经成为连接用户和互联网的重要纽带,而Android平台手机将无缝结合这些优秀的

Google 服务。

再说Android的5大不足:

一、安全和隐私

由于手机与互联网的紧密联系,个人隐私很难得到保守。除了上网过程中经意或不经意留下的个人足迹,

Google这个巨人也时时站在你的身后,洞穿一切,因此,互联网的深入将会带来新一轮的隐私危机。

二、首先开卖Android手机的不是最大运营商

众所周知,T-Mobile在23日,于美国纽约发布了Android首款手机G1。但是在北美市场,最大的两家运营商乃AT&T和Verizon,而目前所知取得Android手机销售权的仅有T-Mobile和Sprint,其中T- Mobile的3G网络相对于其他三家也要逊色不少,因此,用户可以买账购买G1,能否体验到最佳的3G

网络服务则要另当别论了!

三、运营商仍然能够影响到Android手机

在国内市场,不少用户对购得移动定制机不满,感觉所购的手机被人涂画了广告一般。这样的情况在国外市场同样出现。Android手机的另一发售运营商Sprint就将在其机型中内置其手机商店程序。

四、同类机型用户减少

在不少手机论坛都会有针对某一型号的子论坛,对一款手机的使用心得交流,并分享软件资源。而对于Android平台手机,由于厂商丰富,产品类型多样,这样使用同一款机型的用户越来越少,缺少统一机型的程序强化。举个稍显不当的例子,现在山寨机泛滥,品种各异,就很少有专门针对某个型号山寨机的讨论和群组,除了哪些功能异常抢眼、颇受追捧的机型以外。

五、过分依赖开发商缺少标准配置

在使用PC端的Windows Xp系统的时候,都会内置微软Windows Media Player这样一个浏览器程序,用户可以选择更多样的播放器,如Realplay或暴风影音等。但入手开始使用默认的程序同样可以应付多

样的需要。在Android平台中,由于其开放性,软件更多依赖第三方厂商,比如Android系统的SDK中

就没有内置音乐播放器,全部依赖第三方开发,缺少了产品的统一性。

20. JVM 跟DVM

Dalvik和标准Java虚拟机(JVM)首要差别

Dalvik基于寄存器,而JVM基于栈。基于寄存器的虚拟机对于更大的程序来说,在它们编译的时候,花费的时间更短。

Dalvik和Java运行环境的区别

1: Dalvik主要是完成对象生命周期管理,堆栈管理,线程管理,安全和异常管理,以及垃圾回收等等重要功能。

2: Dalvik负责进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,

其代码在虚拟机的解释下得以执行。

:不同于Java虚拟机运行java字节码,Dalvik虚拟机运行的是其专有的文件格式Dex 4:dex文件格

式可以减少整体文件尺寸,提高l/o操作的类查找速度。

5:odex是为了在运行过程中进一步提高性能,对dex文件的进一步优化。

6:所有的Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制

7:有一个特殊的虚拟机进程Zygote,他是虚拟机实例的孵化器。它在系统启动的时候就会产生,它会完成虚拟机的初始化,库的加载,预制类库和初始化的操作。如果系统需要一个新的虚拟机实例,它会迅速复制自身,以最快的数据提供给系统。对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内

存区域。

很多人认为Dalvik虚拟机是一个Java虚拟机,因为Android的编程语言恰恰就是Java语言。但是这种说法并不准确,因为Dalvik虚拟机并不是按照Java虚拟机的规范来实现的,两者并不兼容;同时还要两个明显的不同:

Java虚拟机运行的是Java字节码,而Dalvik虚拟机运行的则是其专有的文件格式DEX (Dalvik

Executable )。

在Java SE程序中的Java类会被编译成一个或者多个字节码文件(.class )然后打包到JAR文件,而后Java虚拟机会从相应的CLASS文件和JAR文件中获取相应的字节码;Android应用虽然也是使用Java 语言进行编程,但是在编译成CLASS 文件后,还会通过一个工具(dx)将应用所有的CLASS文件转换成一个DEX文件,而后Dalvik虚拟机会从其中读取指令和数据。

Dalvik虚拟机主要是完成对象生命周期的管理,堆栈的管理,线程管理,安全和异常的管理,以及垃圾回收等等重要功能。

一个应用,一个虚拟机实例,一个进程

21.Android dvm的进程和Linux的进程,应用程序的进程是否为同一个概念

答:DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的

Dalvik虚拟机实例。而每一个DVM都是在Linux中的一个进程,所以说可以认为是同一个概念。

22.sim卡的EF文件是什么?有何作用

答:sim卡的文件系统有自己规范,主要是为了和手机通讯,sim本身可以有自己的操作系统,EF就是

作存储并和手机通讯用的

23.嵌入式操作系统内存管理有哪几种,各有何特性

页式,段式,段页,用到了MMU,虚拟空间等技术

24.什么是嵌入式实时操作系统,Android 操作系统属于实时操作系统吗?

嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。主要用于工业控制、军事设备、航空航天等领域对系统的响应时间有苛刻的要求,这

就需要使用实时系统。又可分为软实时和硬实时两种,而android是基于linux内核的,因此属于软实时。

25.一条最长的短信息约占多少byte?

中文70(包括标点),英文160个字节。

26.DDMS和TraceView 的区别?

DDMS是一个程序执行查看器,在里面可以看见线程和堆栈等信息,TraceView是程序性能分析器

27.java中如何引用本地语言

可以用JNI (java native interface java 本地接口)接口

28.谈谈Android的IPC (进程间通信)机制

IPC是内部进程通信的简称,是共享"命名管道"的资源。Android中的IPC机制是为了让Activity

和Service之间可以随时的进行交互,故在Android中该机制,只适用于Activity和Service之间的通信,

类似于远程方法调用,类似于C/S模式的访问。通过定义AIDL接口文件来定义IPC接口。Servier端实

现IPC接口,Client端调用IPC接口本地代理。

29.NDK是什么

NDK是一些列工具的集合,NDK提供了一系列的工具,帮助开发者迅速的开发C/C++的动态库,

并能自动将so和java应用打成apk包。

NDK集成了交叉编译器,并提供了相应的mk文件和隔离cpu、平台等的差异,开发人员只需简单

的修改mk文件就可以创建出so

30.请解释下Android程序运行时权限与文件系统权限的区别。

答:运行时权限Dalvik( android授权)

文件系统linux内核授权

31.Service 和Thread 的区别?

答:servie是系统的组件,它由系统进程托管(servicemanager );它们之间的通信类似于client和server,是一种轻量级的ipc通信,这种通信的载体是binder,它是在linux层交换信息的一种ipc。而

thread是由本应用程序托管。

1) . Thread : Thread是程序执行的最小单元,它是分配CPU的基本单位。可以用Thread来执行一些异

步的操作。

2) . Service : Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的

Service是运行在主进程的main线程上的。如:onCreate,onStart这些函数在被系统调用的时候都是

在主进程的main线程上运行的。如果是Remote Service,那么对应的Service则是运行在独立进程的main 线程上。

既然这样,那么我们为什么要用Service 呢?其实这跟android 的系统机制有关,我们先拿

Thread 来说。Thread的运行是独立于Activity的,也就是说当一个Activity被finish之后,如果你没有主动停止Thread 或者Thread里的run方法没有执行完毕的话,Thread也会一直执行。因此这里会出现一个问题:当Activity被finish 之后,你不再持有该Thread的引用。另一方面,你没有办法在不

同的Activity 中对同一Thread进行控制。

举个例子:如果你的Thread需要不停地隔一段时间就要连接服务器做某种同步的话,该Thread需

要在Activity没有start的时候也在运行。这个时候当你start 一个Activity就没有办法在该Activity里

面控制之前创建的Thread。因此你便需要创建并启动一个Service ,在Service里面创建、运行并控

制该Thread,这样便解决了该问题(因为任何Activity都可以控制同一Service,而系统也只会创建一个对应Service 的实例)。

因此你可以把Service 想象成一种消息服务,而你可以在任何有Context 的地方调用

Context.startService 、Context.stopService 、Context.bindService ,Context.unbindService ,来控制它,你也可以在Service 里注册BroadcastReceiver,在其他地方通过发送broadcast来控制它,当然这些

都是Thread做不到的。

32.描述一下android 的系统架构

android系统架构分从下往上为linux内核层、运行库、应用程序框架层、和应用程序层。

linuxkernel :负责硬件的驱动程序、网络、电源、系统安全以及内存管理等功能。

libraries和android runtime : libraries :即卩C/C++函数库部分,大多数都是开放源代码的函数库,例如webkit (引擎),该函数库负责android网页浏览器的运行,例如标准的c函数库libc、openssl、sqlite等,当然也包括支持游戏开发2dsgl和3dopengles,在多媒体方面有mediaframework框架来支持各种影音和图形文件的播放与显示,例如mpeg4、h.264、mp3、

aac、amr、jpg和png等众多的多媒体文件格式。android的runtime负责解释和执行生成的dalvik格式

的字节码。

applicationframework (应用软件架构),java应用程序开发人员主要是使用该层封装好的api进

行快速开发。

applications: 该层是java 的应用程序层,android 内置的googlemaps、e-mail、即时通信工具、浏览器、mp3播放器等处于该层,java开发人员开发的程序也处于该层,而且和内置的应用程序具有平等的位置,可以调用内置的应用程序,也可以替换内置的应用程序。

上面的四个层次,下层为上层服务,上层需要下层的支持,调用下层的服务,这种严格分层的方式带来的

极大的稳定性、灵活性和可扩展性,使得不同层的开发人员可以按照规范专心特定层的开发。

android应用程序使用框架的api并在框架下运行,这就带来了程序开发的高度一致性,另一方面也告诉我们,要想写出优质高效的程序就必须对整个applicationframework 进行非常深入的理解。精通applicationframework ,你就可以真正的理解android的设计和运行机制,也就更能够驾驭整个应用层的开发。

33.什么是ANR如何避免它?

答:ANR : Application Not Responding。在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序

的响应,当用户操作的在5s内应用程序没能做出反应,BroadcastReceiver在10秒内

没有执行完毕,就会出现应用程序无响应对话框,这既是ANR。

避免方法:Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去

做创建操作。潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线

程里(或者异步方式)来完成。主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。

34.说说mvc模式的原理,它在android中的运用,android 的官方建议应用程序的开发米用mvc模

式。何谓mvc?

mvc 是model,view,controller 的缩写,mvc 包含三个部分:

模型(model )对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。

视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一

可以看到的一层,接收用户的输入,显示处理结果。

控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的

部分,控制器更重要的一种导航功能,响应用户出发的相关事件,交给m层处理。

android鼓励弱耦合和组件的重用,在android中mvc的具体体现如下:

1)视图层(view):一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入,当然,

如果你对android 了解的比较的多了话,就一定可以想到在android中也可以使用javascript+html等的方式作为view

层,当然这里需要进行java和javascript之间的通信,幸运的是,android提供了它们之间非常方便的通信实现。

2)控制层(controller): android的控制层的重任通常落在了众多的acitvity的肩上,这句话也就

暗含了不要在acitivity中写代码,要通过activity交割model业务逻辑层处理,这样做的另外一个原因是android中的

acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。

3)模型层(model ):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务

计算等操作也是必须放在的该层的。

35.简要解释一下activity 、intent 、intent

filter 、service 、Broadcase 、BroadcaseReceiver

答:一个activity呈现了一个用户可以操作的可视化用户界面;一个service不包含可见的用户界面,而是在后台运行,可以与一个activity绑定,通过绑定暴露出来接口并与其进行通信;一个broadcast

receiver是一个接收广播消息并做出回应的component ,broadcast receiver没有界面;一个intent是一

个Intent对象,它保存了消息的内容。对于activity和service来说,它指定了请求的操作名称和待操作

数据的URI,Intent对象可以显式的指定一个目标component。如果这样的话,android会找到这个

component(基于manifest文件中的声明)并激活它。但如果一个目标不是显式指定的,android必须找到

响应intent的最佳component。它是通过将Intent对象和目标的intent filter相比较来完成这一工作的;

一个component 的intent filter 告诉android 该component 能处理的intent。intent filter 也是在manifest 文件中声明的。

36.根据自己的理解描述下Android数字签名。

答:(1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序

(2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证

(3)如果要正式发布一个Android ,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。

(4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。

37.IntentService 有何优点?

答:IntentService 的好处:

* Acitivity的进程,当处理Intent的时候,会产生一个对应的Service ;

* Android的进程处理器现在会尽可能的不

*非常容易使用;

38. View如何刷新?

View 可以调用invalidate。和postlnvalidate()

kill掉你; 这两个方法刷新

相关主题