Android常见面试题(一)

总结了一些常见的Android面试题,内容会随着不断学习陆续增加。答案有误地方希望大家可以指正 ,同时希望大家一起补充总结更多常见问题,谢谢^_^

1. 简述Activity的生命周期 2. 请简单说下对广播接收者有哪些了解 3. view如何刷新?简述什么是双缓冲? 4、AIDL的全称是什么?如何工作?能处理哪些类型的数据? 5、java中如何引用本地语言 6、谈谈Android的IPC(进程间通信)机制 7、NDK 是什么 8、如何将SQLite数据库(xxx.db文件)与apk文件一起发布

1.简述Activity的生命周期

1、Activity可见并获得焦点 当Activity启动的时候,首先调用onCreate()、onStart(),onResume()方法,此时Activity对用户来说,是可见的状态

2、Activity可见但没获得焦点 当Activity从可见状态变为被Dialog遮挡的状态的时候,会调用onPause()方法,此时的Activity对用户可见,但是不能获得焦点

3、Activity不可见 当Activity从可见状态变为被其他的Activity完全覆盖或者是点击Home进入后台的时候,会依次调用onPause()//onStop()方法,如果在这个期间,系统内存不足,导致Activity被回收的话,还会调用onDestory()方法

4、Activity可见、没获得焦点状态 –> Activity可见、获得焦点状态 当Activity从被Dialog遮挡的状态恢复的时候,会调用onResume()方法,从而恢复可以点击的状态

5、Activity不可见、没获得焦点状态 –> Activity可见、获得焦点状态 当Activity从被其他Activity遮挡或者是进入后台状态后恢复,若没有被系统回收,会依次调用onRestart()、onStart()、onResume()方法,恢复到可以与用户进行交互的状态

6、Activity不可见状态–> Activity被回收 –> Activity可见、获得焦点状态 当Activity从被其他Activity遮挡或者进入后台,而且被系统回收的时候,此时恢复Activity,相当于重新打开一个Activity,既调用onCreate()、onStart()//onResume()方法,从而恢复到可与用户进行交互的状态(期间可调用onRestoreInstanceState(),进行界面恢复)。

7、Activity可见、获得焦点状态 –> Activity可见、没获得焦点状态 或 不可见状态 在onPause()方法执行后,系统会停止一些消耗 CPU 的操作,,因为这个时候程序的优先级降低,很有可能被系统收回,所以我们应该在这个方法里做数据持久化处理。保存的数据可在 onResume() 里读出来,帮用户恢复到之前的状态。

8、Activity结束 在onDestroy()执行后,activity生命周期就结束了,可用 isFinishing()方法来判断。如果此时有 Progress Dialog显示,我们应该在onDestroy()里 cancel 掉,否则线程结束的时候,调用Dialog 的 cancel 方法会抛异常。

2.请简单说下对广播接收者有哪些了解

广播接收者(BroadcastReceiver)用于接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收,这个特性跟JMS中的Topic消息接收者类似。要实现一个广播接收者方法如下: 第一步:继承BroadcastReceiver,并重写onReceive()方法。

{(Context context, Intent intent) {} }

第二步:订阅指定的广播Intent,订阅方法有两种: 第一种:使用代码进行订阅

IntentFilter filter = new IntentFilter(“android.provider.Telephony.SMS_RECEIVED”);IncomingSMSReceiver receiver = new IncomingSMSReceiver();registerReceiver(receiver, filter);

第二种:在AndroidManifest.xml文件中的节点里进行订阅:

>> </receiver>

广播类型:

广播分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”。普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高,但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播;然而有序广播是按照接收者声明的优先级别,被接收者依次接收广播。如:A的级别高于B,B的级别高于C,那么,广播先传给A,再传给B,最后传给C 。优先级别声明在intent-filter元素的android:priority属性中,数越大优先级别越高,取值范围:-1000到1000,优先级别也可以调用IntentFilter对象的setPriority()进行设置 。有序广播的接收者可以终止广播Intent的传播,广播Intent的传播一旦终止,后面的接收者就无法接收到广播。另外,有序广播的接收者可以将数据传递给下一个接收者,如:A得到广播后,可以往它的结果对象中存入数据,当广播传给B时,B可以从A的结果对象集合中得到A存入的数据。

Context.sendBroadcast() 发送的是普通广播,所有订阅者都有机会获得并进行处理。

Context.sendOrderedBroadcast() 发送的是有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者,前面的接收者有权终止广播

BroadcastReceiver.abortBroadcast(),如果广播被前面的接收者终止,后面的接收者就再也无法获取到广播。对于有序广播,前面的接收者可以将数据通过setResultExtras(Bundle)方法存放进结果对象,然后传给下一个接收者,下一个接收者通过代码:Bundle bundle = getResultExtras(true))可以获取上一个接收者存入在结果对象中的数据。

系统收到短信,发出的广播属于有序广播。如果想阻止用户收到短信,可以通过设置优先级,让你们自定义的接收者先获取到广播,然后终止广播,这样用户就接收不到短信了。

广播接收者的响应: 在Android中,每次广播消息到来时都会创建BroadcastReceiver实例并执行onReceive() 方法, onReceive() 方法执行完后,BroadcastReceiver 的实例就会被销毁。当onReceive() 方法在10秒内没有执行完毕,Android会认为该程序无响应。所以在BroadcastReceiver里不能做一些比较耗时的操作,否侧会弹出ANR(Application No Response)的对话框。如果需要完成一项比较耗时的工作,应该通过发送Intent给Service,由Service来完成。这里不能使用子线程来解决,因为BroadcastReceiver的生命周期很短,子线程可能还没有结束BroadcastReceiver就先结束了。BroadcastReceiver一旦结束,此时BroadcastReceiver的所在进程很容易在系统需要内存时被优先杀死,因为它属于空进程(没有任何活动组件的进程)。如果它的宿主进程被杀死,那么正在工作的子线程也会被杀死。所以采用子线程来解决是不可靠的。

{(Context context, Intent intent) {//发送Intent启动服务,由服务来完成比较耗时的操作Intent service = new Intent(context, XxxService.class);context.startService(service);} }

常用广播Intent:

除了短信到来广播Intent,Android还有很多广播Intent,如:开机启动、电池电量变化、时间已经改变等广播Intent。

接收开机启动广播Intent,在AndroidManifest.xml文件中的节点里订阅此Intent:

>> </receiver>

并且要进行权限声明:

<uses-permission android:name=”android.permission.RECEIVE_BOOT_COMPLETED”/>

接收电池电量变化广播Intent ,在AndroidManifest.xml文件中的节点里订阅此Intent:

>> </receiver>

广播接收者的生命周期及使用注意事项

1、广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁

2、广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框,耗时的较长的工作最好放在服务中完成

3、最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉

3.view如何刷新?简述什么是双缓冲?

android中实现view的刷新有两个方法,一个是invalidate(),另一个是postInvalidate(),其中前者是在UI线程自身中使用,而后者在非UI线程中使用。

经验是由痛苦中粹取出来的

Android常见面试题(一)

相关文章:

你感兴趣的文章:

标签云: