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系统?优缺点。