android面试笔试题大全

1、简要解释一下activity、 intent 、intent filter、service、Broadcast、BroadcaseReceiver 
一个activity呈现了一个用户可以操作的可视化用户界面 
一个service不包含可见的用户界面,而是在后台无限地运行  可以连接到一个正在运行的服务中,连接后,可以通过服务中暴露出来的借口与其进行通信  
一个broadcast receiver是一个接收广播消息并作出回应的component,broadcast receiver没有界面  
intent:content provider在接收到ContentResolver的请求时被激活。 activity, service和broadcast receiver是被称为intents的异步消息激活的。  
一个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文件中声明的。

2.    请描述下Activity的生命周期。
activity主要生命周期的方法说明:   
onCreate(Bundle savedInstanceState):创建activity时调用。设置在该方法中,还以Bundle的形式提供对以前储存的任何状态的访问!   
onStart():activity变为在屏幕上对用户可见时调用。   
onResume():activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。  
onPause():activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧!   
onStop():activity被停止并转为不可见阶段及后续的生命周期事件时调用。   
onRestart():重新启动activity时调用。该活动仍在栈中,而不是启动新的活动。  
onDestroy():activity被完全从系统内存中移除时调用,该方法被调用
  
3.横竖屏切换时候activity的生命周期   
1)、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2)、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3)、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法 
  
4.    如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
onSaveInstanceState onRestoreInstanceState
 
5.    如何将一个Activity设置成窗口的样式。
android:theme="@style/Theme.Dialog"  

6.    如何退出Activity?如何安全退出已调用多个Activity的Application? 
finish 子类继承基类 通知 getApplicationContext

7.    请介绍下Android中常用的五种布局。  
RelativeLayout AbsoluteLayout LinearLayout TableLayout FrameLayout


8.    请介绍下Android的数据存储方式。(Edited by Sodino)  
1)使用SharedPreferences存储数据 //edit putString getString commit clear
2)使用ContentProvider存储数据   // Uri uri = Uri.parse("content://com.changcheng.provider.contactprovider/contact")  delete
3)SQLite数据库存储数据 //SQLiteDatabase db.executeSQL insert update delete query
4)文件存储数据 //FileInputStream openFileInput(String name); FileOutputStream(String name , int mode),
5)网络存储数据

9.    请介绍下ContentProvider是如何实现数据共享的。
一个程序可以通过实现一个Content provider的抽象接口将自己的数据完全暴露出去,而且Content providers是以类似数据库中表的方式将数据暴露。
Content providers存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。
如何通过一套标准及统一的接口获取其他应用程序暴露的数据?
Android提供了ContentResolver,外界的程序可以通过ContentResolver接口访问ContentProvider提供的数据。

10.    如何启用Service,如何停用Service。(Edited by Sodino)  
onCreate onDestroy //只执行一次
startService onstart stopService onstop //使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。//成对运行
bindService onbind unbindService onUnbind //使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。//成对运行

11、IntentService有何优点?
1)Acitivity的进程,当处理Intent的时候,会产生一个对应的Service
2)Android的进程处理器现在会尽可能的不kill掉你
3)非常容易使用

12.根据自己的理解描述下Android数字签名
(1)有利于程序升级

13.android中的动画有哪几类,它们的特点和区别是什么 
tween(在两者之间) frame   

14、View如何刷新? 
View 可以调用invalidate()和postInvalidate()这两个方法刷新


15、DDMS与TraceView的区别?  
DDMS是一个程序执行查看器,在里面你可以看见线程和堆栈等信息,
TraceView是程序性能分析器

16.widget相对位置的完成在antivity的哪个生命周期阶段实现    
    
17.android中有哪几种解析xml的类,官方推荐哪种?以及它们的原理和区别 
XML解析主要有三种方式,SAX、DOM、PULL。
常规在PC上开发我们使用Dom相对轻松些,但一些性能敏感的数据库或手机上还是主要采用SAX方 式,
SAX读取是单向的,优点:不占内存空间、解析属性方便,但缺点就是对于套嵌多个分支来说处理不是很方便。
DOM方式会把整个XML文件加载到内存 中去,这里Android开发网提醒大家该方法在查找方面可以和XPath很好的结合如果数据量不是很大推荐使用,
而PULL常常用在J2ME对于节点处理比较好,类似SAX方式,同样很节省内存,在J2ME中我们经常使用的KXML库来解析。

18、什么是ANR 如何避免它?  
ANR:Application Not Responding
在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。
当出现下列情况时,Android就会显示ANR对话框了:  对输入事件(如按键、触摸屏事件)的响应超过5秒  
意向接受器(intentReceiver)超过10秒钟仍未执行完毕  
 
19、什么情况会导致Force Close ?如何避免?能否捕获导致其的异常?  
一般像空指针、算术、参数、数组越界啊,可以看起logcat,然后对应到程序中 来解决错误 

20、Android本身的api并未声明会抛出异常,则其在运行时有无可能抛出runtime异常,你遇到过吗?诺有的话会导致什么问题?如何解决? 
同上题

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

22. sim卡的EF 文件有何作用    
sim卡的文件系统有自己规范,主要是为了和手机通讯,sim本 身可以有自己的操作系统,EF就是作存储并和手机通讯用的


23.嵌入式操作系统内存管理有哪几种, 各有何特性    
页式,段式,段页,用到了MMU,虚拟空间等技术

24. 什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?  
分硬实时和软实时,android属于linux内核,linux在用户空间可抢占,内核空间在2.4以后可 局部抢占,严格来讲 Android属于软实时系统  
 
25. 一条最长的短信息约占多少byte?
中文70(包括标点)  英文160 

26.    注册广播有几种方式,这些方式有何优缺点?
第一种方式:在Manifest.xml中注册广播,是一种比较推荐的方法,因为它不需要手动注销广播(如果广播未注销,程序退出时可能会出错)。
具体实现在Manifest的application中添加:
<receiver android:name=".mEvtReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
第二种方式,直接在代码中实现,但需要手动注册注销//unregisterReceiver

27. Android引入广播机制的用意?
  答:a:从MVC的角度考虑(应用程序内)
 其实回答这个问题的时候还可以这样问,android为什么要有那4大组件,现在的移动开发模型基本上也是照搬的web那一套MVC架构,
只不过 是改了点嫁妆而已。android的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC架构,
它们之间有时候是一种相互依存的关系,有时候又是一 种补充关系,引入广播机制可以方便几大组件的信息和数据交互。
  b:程序间互通消息(例如在自己的应用程序内监听系统来电)
  c:效率上(参考UDP的广播协议在局域网的方便性)
  d:设计模式上(反转控制的一种应用,类似监听者模式)

28.    请解释下Android程序运行时权限与文件系统权限的区别。
apk程序是运行在虚拟机上的,对应的是Android独特的权限机制,只有体现到文件系统上时才使用linux的权限设置。
android系统有的权限是基于签名的。

29.framework工作方式及原理,Activity是如何生成一个view的,机制是什么。

30. android本身的一些限制,不如apk包大小限制,读取大文件 时的时间限制.


31.    系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由。  
通过直接发送Uri把参数带过去,或者通过manifest里的intentfilter里的data属性

32.    有一个一维整型数组int[]data保存的是一张宽为width,高为height的图片像素值信息。请写一个算法,将该图片所有的白色不透明(0xffffffff)像素点的透明度调整为50%。 


33. 如何将SQLite数据库(dictionary.db文件)与apk文件一起发布?
  解答:可以将dictionary.db文件复制到Eclipse Android工程中的res/raw目录中。所有在res/raw目录中的文件不会被压缩,
这样可以直接提取该目录中的文件。可以将dictionary.db文件复制到res aw目录中

34. 如何将打开res/raw目录中的数据库文件?
  解答:在Android中不能直接打开res aw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,
然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得res aw目录中资源的 InputStream对象,
然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。

35.说说activity,intent,service是什么关系   
intent是activity和service的桥梁,通信员,activity主要操作显示界面,service在后台运行,适合长时间运行,如下载,听歌等。。 

36.说说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里面处理,当然对业务计算等操作也是必须放在的该层的。


37.handler机制的原理    
  andriod提供了 Handler 和 Looper 来满足线程间的通信。Handler 先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。
  1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。
  2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息。
  3) Message Queue(消息队列):用来存放线程放入的消息。
  4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。


38.    请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。 
Handler获取当前线程中的looper对象,
looper用来从存放Message的MessageQueue中取出Message,
再有Handler进行Message的分发和处理


39.android中线程与线程,进程与进程之间如何通信 
windows:进程的通信机制主要有:管道、有名管道、消息队列、信号量、共享空间、信号、套接字。
android: Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信。
进程:组件运行于哪个进程中由清单文件控制。组件元素——<activity>、<service>、<receiver>、<provider>,都有一个process属性可以指定组件运行在哪个进程中。
这个属性可以设置为每个组件运行在自己的进程中,或者某些组件共享一个进程而其他的不共享。
他们还可以设置为不同应用程序的组件运行在同一个进程中——假设这些应用程序共享同一个Linux用户ID且被分配了同样的权限。
<application>元素也有process属性,为所有的组件设置一个默认值。
一个RPC接口仅包含方法。所有的方法同步地执行(本地方法阻塞直到远程方法执行完成),即使是没有返回值。
进程间通信有两种方法:
1)跨进程binder(AIDL方式)
2)另外os级别的socket


线程:因为用户界面必须很快地响应用户的操作,所以活动寄宿的线程不应该做一些耗时的操作如网络下载。任何不可能在短时间完成的操作应该分配到别的线程。
线程在代码中是用标准的Java线程对象创建的,Android提供了一些方便的类来管理线程—---
Looper用于在线程中运行消息循环、Handler用户处理消息、HandlerThread用户设置一个消息循环的线程。
注意点:
1). 不要阻塞UI线程. 如果在UI线程中执行阻塞或者耗时操作会导致UI线程无法响应用户请求.
2). 不能在非UI线程(也称为工作线程)中更新UI, 这是因为android的UI控件都是线程不安全的.


android提供了3种线程间通信的方案:
1)Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
示例:
mImageView.setImageBitmap(b);  -->
mImageView.post(new Runnable() {  
                // run方法会在UI线程中执行  
                public void run() {  
                    mImageView.setImageBitmap(bitmap);  
                }  
            }); 
如果在工作线程中调用了这3个方法, 那么方法中Runnable参数封装的操作会在UI线程中执行.
2)Message Handler机制. Handler机制允许开发者在工作线程中调用与UI线程绑定的handler对象的sendMessage()方法向UI线程的消息队列发送一条消息, 
UI线程会在适当的时候从消息队列中取出消息并完成处理.
3)使用AsyncTask类. 创建一个AsyncTask类的子类, 并根据需要选择覆写onPreExecute(), doInBackground(), onProgressUpdate(), onPostExecute()方法.
执行流程: 在UI线程中调用AsyncTask类的execute方法(只有该步骤是由程序员控制的)-->系统调用onPreExecute(), 
这个方法在UI线程中执行-->系统调用doInBackground()方法, 这个方法在工作线程中执行-->在doInBackground()方法中每调用一次publishProgress()方法, 
就会在UI线程中执行一次onProgressUpdate()方法-->doInBackground()方法执行完成后, 系统将调用 onPostExecute()方法, 
并将doInBackground()方法的返回值传递给 onPostExecute()方法的形参.  onPostExecute()方法在UI线程中执行.
public void onClick(View v) {  
    new DownloadImageTask().execute("http://example.com/image.png");  
}  
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {  
    protected Bitmap doInBackground(String... urls) {  
        return loadImageFromNetwork(urls[0]);  
    }  
      
    protected void onPostExecute(Bitmap result) {  
        mImageView.setImageBitmap(result);  
    }  

 
40、谈谈Android的IPC机制
IPC是内部进程通信(interprocess communication)的简称, 是共享"命名管道"的资源。
Android中的IPC机制是为了让Activity和Service之间可以随时的进行交互,故在Android中该机制,
只适用于Activity和Service之间的通信,类似于远程方法调用,类似于C/S模式的访问。
通过定义AIDL接口文件来定义IPC接口。
Servier端实现IPC接口,Client端调用IPC接口本地代理。


41.    AIDL的全称是什么?如何工作?能处理哪些类型的数据?  
aidl是 Android Interface definition language的缩写,通过它我们可以定义进程间的通信接口


下面是些AIDL支持的数据类型: 
1. 不需要import声明的简单Java编程语言类型(int,boolean等) 
2. String, CharSequence不需要特殊声明  
3. List, Map和Parcelables类型, 这些类型内所包含的数据成员也只能是简单数据类型
, String等其他比支持的类型. 


创建过程:
1)创建aidl文件
package com.cao.android.demos.binder.aidl;    
import com.cao.android.demos.binder.aidl.AIDLActivity;  
interface AIDLService {     
    void registerTestCall(AIDLActivity cb);     
    void invokCallBack();  
}  
2)编译aidl文件,如果aidl文件的内容是正确的,ADT会自动生成一个Java接口文件(*.java)。
3)实现一个服务类(Service的stub子类)(定义aidl接口中的内部抽象类Stub)
private final AIDLService.Stub mBinder = new AIDLService.Stub() {  
  
    @Override  
    public void invokCallBack() throws RemoteException {  
        Log("AIDLService.invokCallBack");  
        Rect1 rect = new Rect1();  
        rect.bottom=-1;  
        rect.left=-1;  
        rect.right=1;  
        rect.top=1;  
        callback.performAction(rect);  
    }  
  
  
    @Override  
    public void registerTestCall(AIDLActivity cb) throws RemoteException {  
        Log("AIDLService.registerTestCall");  
        callback = cb;  
    }  
};  
4)客户端如何调用服务端得aidl描述的接口对象AIDLService mService;  
获取服务端得aidl对象后mService = AIDLService.Stub.asInterface(service);,
就可以在客户端使用它了,对mService对象方法的调用不是在客户端执行,而是在服务端执行。
private ServiceConnection mConnection = new ServiceConnection() {  
    public void onServiceConnected(ComponentName className, IBinder service) {  
        Log("connect service");  
        mService = AIDLService.Stub.asInterface(service);  
        try {  
            mService.registerTestCall(mCallback);  
        } catch (RemoteException e) {  
  
        }  
    }  
    public void onServiceDisconnected(ComponentName className) {  
        Log("disconnect service");  
        mService = null;  
    }  
};  
(5)在AndroidManifest.xml文件中配置AIDL服务,
尤其要注意的是,<action>标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。


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


 













你可能感兴趣的:(android面试笔试题大全)