Android面试题汇总
1、 Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。2、sim卡的EF 文件有何作用sim卡的文件系统有自己规范,主要是为了和手机通讯,sim本 身可以有自己
1、 Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念
DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。
2、sim卡的EF 文件有何作用
sim卡的文件系统有自己规范,主要是为了和手机通讯,sim本 身可以有自己的操作系统,EF就是作存储并和手机通讯用的
3、嵌入式操作系统内存管理有哪几种, 各有何特性
页式,段式,段页,用到了MMU,虚拟空间等技术
4、 什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?
嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。主要用于工业控制、 军事设备、 航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可分为软实时和硬实时两种,而android是基于linux内核的,因此属于软实时。
5、一条最长的短信息约占多少byte?
中文70(包括标点),英文160,160个字节。
6、 android中的动画有哪几类,它们的特点和区别是什么?
两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。
7、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。
8、说说mvc模式的原理,它在android中的运用
android的官方建议应用程序的开发采用mvc模式。何谓mvc?
mvc是model,view,controller的缩写,mvc包含三个部分:
l模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
l视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
l控制器(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里面处理,当然对业务计算等操作也是必须放在的该层的。
9、Activity的生命周期
和其他手机 平台 的应用 程序 一样,Android的应用程序 的生命周期是被统一掌控 的,也
就是说我们写的应用程序命运掌握在别人(系统)的手里,我们不能改变它,只能学习 并
适应它。
简单地说一下为什么是这样:我们手机在运行 一个应用程序的时候,有可能打进来电话
发进来短信 ,或者没有电了,这时候程序都会被中断,优先去服务电话的基本功能 ,另
外系统也不允许你占用太多资源 ,至少要保证电话功能吧,所以资源不足的时候也就有可
能被干掉。
言归正传,Activity的基本生命周期如下代码 所示:
Java代码
public
class MyActivity extends Activity {
protected
void onCreate(Bundle savedInstanceState);
protected
void onStart();
protected
void onResume();
protected
void onPause();
protected
void onStop();
protected
void onDestroy();
}
public class MyActivity extends Activity { protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy(); }
你自己写的Activity会按需要 重载这些方法,onCreate是免不了的,在一个Activity正常启动的过程中,他们被调用的顺序是 onCreate -> onStart -> onResume, 在Activity被干掉的时候顺序是onPause -> onStop -> onDestroy ,这样就是一个完整的生命周期,但是有人问了 ,程序正运行着呢来电话了,这个程序咋办?中止了呗,如果中止的时候新出的一个Activity是全屏的那么:onPause->onStop ,恢复的时候onStart->onResume ,如果打断 这个应用程序的是一个Theme为Translucent 或者Dialog 的Activity那么只是onPause ,恢复 的时候onResume 。
详细介绍一下这几个方法中系统在做什么以及我们应该做什么:
onCreate: 在这里创建界面 ,做一些数据 的初始化工作
onStart: 到这一步变成用户可见不可交互 的
onResume: 变成和用户可交互 的,(在activity 栈系统通过栈的方式管理这些个
Activity的最上面,运行完弹出栈,则回到上一个Activity)
onPause: 到这一步是可见但不可交互 的,系统会停止动画 等消耗CPU 的事情
从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候
你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在
onResume里读出来,注意:这个方法里做的事情时间要短,因为下一
个activity不会等到这个方法完成才启动
onstop: 变得不可见 ,被下一个activity覆盖了
onDestroy: 这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方
法或者是系统为了节省空间将它暂时性的干掉,可以用isFinishing()来判
断它,如果你有一个Progress Dialog在线程中转动,请在onDestroy里
把他cancel掉,不然等线程结束的时候,调用Dialog的cancel方法会抛
异常的。
onPause,onstop, onDestroy,三种状态 下 activity都有可能被系统干掉
为了保证程序的正确性,你要在onPause()里写上持久层操作的代码,将用户编辑的内容都保存到存储介质上(一般都是数据库 )。实际工作中因为生命周期的变化而带来的问题也很多,比如你的应用程序起了新的线程在跑,这时候中断了,你还要去维护那个线程,是暂停还是杀掉还是数据 回滚,是吧?因为Activity可能被杀掉,所以线程中使用的变量和一些界面元素就千万要注意了,一般都是采用Android的消息机制 [Handler,Message]来处理多线程和界面交互的问题。
10、让Activity变成一个窗口:Activity属性设定
讲点轻松的吧,可能有人希望做出来的应用程序是一个漂浮在手机主界面的东西,那么很
简单你只需要设置 一下Activity的主题就可以了在AndroidManifest.xml 中定义 Activity的
地方一句话:
Xml代码
android :theme=”@android:style/Theme.Dialog”
android:theme=”@android:style/Theme.Dialog”
这就使你的应用程序变成对话框的形式弹出来了,或者
Xml代码
android:theme=”@android:style/Theme.Translucent”
android:theme=”@android:style/Theme.Translucent”
就变成半透明的,[友情提示-.-]类似的这种activity的属性可以在android.R.styleable 类的AndroidManifestActivity 方法中看到,AndroidManifest.xml中所有元素的属性的介绍都可以参考这个类android.R.styleable
上面说的是属性名称,具体有什么值是在android.R.style中 可以看到,比如这个”@android:style/Theme.Dialog” 就对应于android.R.style.Theme_Dialog ,(‘_’换成’.’ < --注意:这个是文章内容不是笑脸)就可以用在描述文件 中了,找找类定义和描述文件中的对应关系就都明白了。
11、 你后台的Activity被系统回收怎么办:onSaveInstanceState
当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的Activity B
这个时候A会执行
Java代码
public
void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong("id", 1234567890);
}
B 完成以后又会来找A, 这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回
收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数
savedInstanceState,没被收回的就还是onResume就好了。
savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。
Java代码
if(savedInstanceState != null){
long id = savedInstanceState.getLong("id");
}
就像官方的Notepad教程 里的情况,你正在编辑某一个note,突然被中断,那么就把这个note的id记住,再起来的时候就可以根据这个id去把那个note取出来,程序就完整一些。这也是看你的应用需不需要保存什么,比如你的界面就是读取一个列表,那就不需要特殊记住什么,哦, 没准你需要记住滚动条的位置...
12、 调用与被调用:我们的通信使者Intent
要说Intent了,Intent就是这个这个意图 ,应用程序间Intent进行交流,打个电话啦,来个
电话啦都会发Intent, 这个是Android架构的松耦合的精髓部分,大大提高了组件的复用性,比如你要在你的应用程序中点击按钮,给某人打电话,很简单啊,看下代码先:
Java代码
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + number));
startActivity(intent);
扔出这样一个意图,系统看到了你的意图就唤醒了电话拨号程序,打出来电话。什么读联系人,发短信啊,邮件啊,统统只需要扔出intent就好了,这个部分设计 地确实很好啊。
那Intent通过什么来告诉系统需要谁来接受他呢?
通常使用Intent有两种方法,第一种是直接说明需要哪一个类来接收代码如下:
Java代码
Intent intent = new Intent(this, MyActivity.class);
intent.getExtras().putString("id", "1");
tartActivity(intent);
第一种方式很明显,直接指定了MyActivity为接受者,并且传了一些数据给MyActivity,在MyActivity里可以用getIntent()来的到这个intent和数据。
第二种就需要先看一下AndroidMenifest中的intentfilter的配置了
Xml代码
< action
android:name="android.intent.action.VIEW"
/>
< action
android:value="android.intent.action.EDIT"
/>
< action
android:value="android.intent.action.PICK"
/>
< category
android:name="android.intent.category.DEFAULT"
/>
< data
android:mimeType="vnd.android.cursor.dir/vnd.google.note"
/>
这里面配置用到了action, data, category这些东西,那么聪明的你一定想到intent里也会有这些东西,然后一匹配不就找到接收者了吗?
action其实就是一个意图的字符串名称。
上面这段intent-filter的配置文件说明了这个Activity可以接受不同的Action,当然相应的程序逻辑也不一样咯,提一下那个 mimeType,他是在ContentProvider里定义的,你要是自己实现一个ContentProvider就知道了,必须指定 mimeType才能让数据被别人使用。
不知道原理说明白没,总结一句,就是你调用别的界面不是直接new那个界面,而是通过扔出一个intent,让系统帮你去调用那个界面,这样就多么松藕合啊,而且符合了生命周期被系统管理的原则。
想知道category都有啥,Android为你预先定制好的action都有啥等等,请亲自访问官方链接Intent
ps:想知道怎么调用系统应用程序的同学,可以仔细看一下你的logcat,每次运行一个程序的时候是不是有一些信息比如:
Starting activity: Intent { action=android.intent.action.MAINcategories={android.intent.category.LAUNCHER} flags=0x10200000comp={com.android.camera/com.android.camera.GalleryPicker} }
再对照一下Intent的一些set方法,就知道怎么调用咯,希望你喜欢:)
13. 如何退出Activity?如何安全退出已调用多个Activity的Application?
对于单一Activity的应用来说,退出很简单,直接finish()即可。
当然,也可以用killProcess()和System.exit()这样的方法。
但是,对于多Activity的应用来说,在打开多个Activity后,如果想在最后打开的Activity直接退出,上边的方法都是没有用的,因为上边的方法都是结束一个Activity而已。
当然,网上也有人说可以。
就好像有人问,在应用里如何捕获Home键,有人就会说用keyCode比较KEYCODE_HOME即可,而事实上如果不修改framework,根本不可能做到这一点一样。
所以,最好还是自己亲自试一下。
那么,有没有办法直接退出整个应用呢?
在2.1之前,可以使用ActivityManager的restartPackage方法。
它可以直接结束整个应用。在使用时需要权限android.permission.RESTART_PACKAGES。
注意不要被它的名字迷惑。
可是,在2.2,这个方法失效了。
在2.2添加了一个新的方法,killBackgroundProcesses(),需要权限 android.permission.KILL_BACKGROUND_PROCESSES。
可惜的是,它和2.2的restartPackage一样,根本起不到应有的效果。
另外还有一个方法,就是系统自带的应用程序管理里,强制结束程序的方法,forceStopPackage()。
它需要权限android.permission.FORCE_STOP_PACKAGES。
并且需要添加android:sharedUserId=”android.uid.system”属性
同样可惜的是,该方法是非公开的,他只能运行在系统进程,第三方程序无法调用。
因为需要在Android.mk中添加LOCAL_CERTIFICATE := 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结束的间隙,sensor可能有效了。
但至少,我们的目的达到了,而且没有影响用户使用。
1.我们都知道Handler是线程与Activity通信的桥梁,如果线程处理不当,你的机器就会变得很慢,那么线程销毁的方法是:(A)
A. onDestroy()B. onClear()
C. onFinish()
D. onStop()
理解:正确销毁线程的方法应该是handler.removeCallBacks()。
2.SharedPreferences保存文件的路径和扩展名是:/data/data/package_name/shared_prefs/
*.xml.
3.Android的自动恢复功能能够完成?(D)
A.回复地址簿
B.修复丢失的文字信息
C.回复删除的信息
D.恢复备份设置和数据来重新安装程序
4.为满足线程间通信,Android提供了(A)
A.Handler和Looper
B.Handler
C.Message Queue
D.Looper
理解:Android提供了Handler和Looper来满足线程间通信,Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。
1)Looper:一个线程可以产生一个Looper对象,由他来管理此线程里的MEssageQueue(消息队列)
2)Handler:可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue,或者接收Looper从Message Queue取出所送来的消息。
3)Message Queue:用来存放线程放入的消息;
4)UIThread就是主线程,Android启动时会建立一个MessageQueue.
5.下面哪种进程最重要,最后被销毁?(D)
A.服务进程
B.后台进程
C.可见进程
D.前台进程
理解:重要性依次是:前台进程、可见进程、服务进程、后台进程、空进程。所以销毁的顺序为逆方向。
6.在Android中,在屏幕密度为160时,1pt大概等于(B)sp。
A.1.22
B.2.22
C.2.12
D.1.12
理解:在Android中,1pt大概等于2.22sp。
Android支持下列所有单位: 1)px (像素):屏幕上的点;
2)in(英寸):长度单位;
3)mm(毫米):长度单位;
4)pt(磅):1/72英寸
5)dp(与密度无关的像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp=1px;
6)dip (同dp)
7)sp (与刻度无关的像素):与dp类似,但是可以根据用户字体大小首选项进行缩放。
Apk的资源包中:
当屏幕density=240时,使用hdpi标签的资源;
当屏幕density=160时,使用mdpi标签的资源;
当屏幕density=120时,使用ldpi标签的资源;
(1)在屏幕密度为160时,1dp=1px=1dip, 1pt=160/72sp, 1pt=1/72英寸,
(2)当屏幕密度为240时,1dp=1dip=1.5px
7.通过Intent传递一些二进制数据的方法:
1)使用Serializable接口实现序列化,这是java常用的方法;
2)实现Parcelable接口,这里Android的部分分类比如Bitmap类已经实现了,同时Parcelable在Android AIDL中交换数据也很常见。
8.下面属于Android的动画分类的有?(A B)
A. Tween
B. Frame
C. Draw
D. Animation
理解:Tween动画,可以使视图组件移动、缩放、旋转、透明度变化;
Frame动画:通过顺序的播放排列好的图片来实现,类似电影;
9.下列关于数据持久化的描述正确的有:(BD)
A. 在内存中缓存多个Bitmap对象是一种数据持久化方法
B. SQLite数据库文件可以保存在SD卡中
C. ContentProvider的主要目的是为了将Android应用的数据持久化
D. 数据持久化就是将内存的数据保存到外存
10.将一个Activity设置成窗口样式,只需要设置Theme即可。
11.Intent传递数据时,下列的数据类型不可以被传递的是(D)
A. Serializable
B. File
C. Parcelable
D. Thread
12.Android DVM的进程和Linux的进程,以下说法错误的是(D)
A.它们都是进程的一种
B. dvm是Android的虚拟机
C. Linux的进程是程序的具体实现,是执行程序的过程
D. dvm中可以创建多个进程来处理应用间的同步问题
理解:每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例,每一个DVM都是在Linux中的一个进程。
13.Toast显示时长默认只有2种,分别为Toast.LENGTH_LONG和Toast.LENGTH_SHORT.
分别为2s和3.5s。其他的值都是无效的。
API文档虽然写的第三个参数是时间,但是Framework做了重定义,限定了2s和3.5s两个值。
14.下列哪些情况下,系统可能会弹出ANR对话框(ABC)
A.在Activity中,Main线程消息队列中的消息在5s内没有得到相应
B.在Service中,onStartCommand()方法执行超过5s
C.在BroadcastReceive中,onReceive()方法执行时间超过10s
D.在启动的新线程中,run()方法执行时间超过5s
理解:ANR:Application Not Responsing
1)UI线程阻塞时间超过5s会ANR;
2)Service属于主线程,耗时操作要开启子线程
3)在BroadcastReceive中,onReceive的生命周期为10s,所以里面的操作不能超过10s
15.在Android中使用Menu时可能需要重写的方法有(AC)
A. onCreateOptionsMenu()
B. onCreateMenu()
C. onOptionsItemSelected()
D. onItemSelected()
理解:一个是创建菜单的方法,一个是菜单项点击事件的方法;
16.下列关于IntentService与Service的关系描述错误的是(CD)
A. IntentService是Service的子类
B. IntentService在运行时会启动新的线程来执行任务
C. 启动方式不同
D.没有区别
理解:IntentService是继承Service的,包含了Service的全部特性,也包含了Service的生命周期,那么与Service不同的是,IntentService在执行onCreate()操作时候,内部开了一个线程,去执行耗时操作。
IntentService和Service的启动方式相同,都是通过startService()方法。
17.在多个应用中读取共享存储数据时,需要用到query()方法,这是哪个对象的方法(A)
A. ContentResolver
B. ContentProvider
C. Cursor
D. SQLiteHelper
理解:ContentResolver和ContentProvider是一对。一个运行在提供数据端(provider),一个运行在调用端(resolver).使用的时候利用resolver(query,insert,update)来调用provider的方法。然后provider再进行数据查询。
18.关于ServiceConnection接口的onServiceConnected()方法的触发条件描述正确的是(B)
A. bindService()方法执行成功后
B. bindService()方法执行成功同时onBInd()方法返回非空IBinder对象
C. Service的onCreate()方法和onBind()方法执行成功后
D. Service的onCreate()和onStartCommand()方法启动成功后
19.Android中使用SQLiteOpenHelper这个辅助类时,可以生成一个数据库,并可以对数据库版本进行管理的方法可以是(AB)
A. getWriteableDatabase()
B. getReadableDatabase()
C. getDatabase()
D. getAbleDatabase()
20.以下关于Toast说法正确的是(BD)
A. Toast能编辑
B. Toast没有焦点
C. Toast可以获得用户输入
D. Toast只能持续一段时间
理解:Toast可以由程序员自定义,但是用户是不能编辑的,用户也无法输入。
注意:可编辑和自定义的概念是不同的。
Toast和Dialog不同,Toast是没有焦点的。
21.在一个ListView中,显示的布局有多种不同的形式,例如某些行只有ImageView,而另外一些行只有TextView.需要重写哪几个方法?(ABCD)
A. getCount()
B. getItemId()
C. getItemViewType()
D. getViewTypeCount()
22.前台进程(Foreground)最重要,通常最后被销毁
与用户当前正在做的事情密切相关。不同的应用程序组件能够通过不同的方法使它的宿主进程移到前台。当下面任何一个条件满足时,可以考虑将进程移到前台:
1)进程正在运行一个与用户交互的Activity,它的onResume()方法被调用
2)进程有一个Service,该Service对应的Activity正在与用户交互
3)进程有一个Service被调用startForeground()方法,要求到前台来执行
4)进程有一个Service,并且在Service的某个回调函数(onCreate(),onStart(),onDestroy())内有正在执行的代码
5)进程有一正在运行的BroadcastReceiver,它的onReceive()方法正在执行。
23.下面关于Android中定义style和theme的描述正确的是(AD)
A.都可以减少重复属性设置
B. style可以作用在Activity上
C. theme可以继承
D. 一个TextView的style中定义了textColor属性,TextView本身也设置textColor属性,那么TextView本身定义的优先级较高。
理解:theme被final标记了,不能被继承;
24.下列对Android NDK的理解正确的是(ABCD)
A. NDK是一系列工具的集合
B. NDK提供了一份稳定、功能有限的API头文件声明
C. 使“java+C”的开发方式终于转正,成为官方支持的开发方式
D. NDK将是Android平台支持C开发的开端
25.下面那条语句可以构造正确的对话框(BC)
A. AlertDialog dialog = new AlertDialog(context)
B. AlertDialog.Builder builder = new AlertDialog.Builder(context)
C. ProgressDialog dialog = new ProgressDialog(context)
D. ProgressDialog.Builder builder = new ProgressDialog.Builder(context)
理解:AlertDialog的构造方法被声明为protected,所以不能直接使用new 关键字来创建AlertDialog类的对象实例。要想创建AlertDialog对话框,需要使用Builder类,该类是AlertDialog类中定义的一个内嵌类。因此必须创建AlertDialog.Builder类的对象实例。
26.下列哪些情况系统会弹出Force Close对话框(BC)
A. 应用运行时,Main线程进行了耗时操作
B. 应用运行时抛出了OutOfMemoryError
C. 应用运行时抛出了RuntimeException
D. 应用运行时,用户操作过于频繁
理解:注意区分ANR 和 Force Close。
A D会导致ANR。
27.Android中MVC模式C层指的是?(A)
A. Activity
B. Service
C. Content
D. Intent
理解:Android控制层的任务一般就是Activity来完成。
视图层对应了Android中的View,也可以理解为布局或者控件。
28.RemoteView在哪些功能中使用?(BD)
A. Toast
B. AppWidget
C. ListView
D. Notification
29.关于BroadcastReceiver的说法不正确的是(B)
A. 是用来接收广播Intent的
B. 一个广播Intent只能被一个订阅了此广播的BroadcastReceiver所接收
C. 对有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者
D. 接收者声明的优先级别在<intent-filter>的android:priority属性中声明,数值越大表示优先级越高。
30.Android系统对下列哪些对象提供了资源池(AC)
A. Message
B. Thread
C. Async Task
D. Looper
理解:
Message提供了消息池,有静态方法Obtain从消息池中取对象;
Thread默认不提供资源池,除非使用线程池ThreadPool管理;
AsyncTask是线程池改造的,默认提供最多5个线程进行并发操作;
Looper创建时创建一个消息队列和线程对象,也不是资源池;
31.Android中的R.java不可以手动修改。
理解:自动生成,无法修改。修改后编译器也会自动改回去。
32.Android DVM的进程和Linux的进程,应用程序的进程是否为同一个概念? 【是】
理解:DVM指dalvik虚拟机,每个Android程序都有一个独立的dvm实例,每个Android应用程序都在他自己的进程中运行。
而一个dvm实例都是作为Linux的进程执行的。可以认为是一个概念。
补充:Dalvik是Google公司自己设计用于Android平台的java虚拟机。每一个Dalvik应用作为一个独立的Linux进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。
33.下列关于Android数字签名描述错误的是:(C)
A.所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
B.Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
C.如果要正式发布一个Android程序,可以使用集成开发工具生成的调试证书来发布
D.数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。
理解:必须要使用一个合适的私钥生成的数字证书给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。
因为集成工具生成的调试证书不是一个包含开发者信息,取得开发者授权的有效私有密钥。
34.Android中可以使用System.out.println(“ ”);在控制台显示想要的内容吗?【不能】
理解:使用System.out.println(“ ”);语句输出的内容也只会出现在LogCat中,而不会出现在Console控制台中。显示的tag为System.out
35.通过startService()和bindService(),以下说法错误的是:(C)
A.通过startService()启动服务:会调用如下生命周期方法:onCreate()-onStart()-onDestroy()
B.当采用startService()方法启动服务,访问者与服务是没有绑定在一起的,访问者退出,服务还在运行
C.如果是调用bindService()启动服务:会调用如下生命周期方法:onCreate()-onBInd()-onDestroy()onUnbind()
D.采用bindService()方法启动服务时, 访问者与服务是绑定在一起的,即访问者退出,服务也就终止,解除绑定
理解:C:onCreate()onBind()onUnbind()onDestroy()
36.使用AIDL完成远程service方法调用下列说法不正确的是(A)
A. AIDL对应的接口名称不能与AIDL文件名相同
B. AIDL的文件的额内容类似java代码
C.创建一个Service(服务),在服务的onBind(Intent intent)方法中返回实现了AIDL接口的对象
D. AIDL对应的接口的方法前面不能加访问权限修饰符
理解:AIDL对应的接口名称必须与AIDL文件名相同,否则无法自动编译;
AIDL对应的接口的方法不能加访问权限修饰符
37.【腾讯2015春招移动客户端开发练习卷】
Android中Looper的实现原理,为什么调用Looper.prepare()就在当前线程关联了一个Looper对象,它是如何实现的。
理解:
1)线程间通信机制:首先,Looper,Handler,MessageQueue三者共同实现了Android系统里线程间通信机制。如在A,B两个子线程之间需要传递消息,首先给每个子线程绑定一套Handler,Looper,MessageQueue机制,然后这三个对象都与各自的线程对应。然后A线程通过调用B线程的Handler对象,发送消息。这个消息会被Handler发送到B线程的MessageQueue中, 而属于B线程的Looper对象一直在循环无限遍历MessageQueue,一旦发现该消息队列里收到新的消息,就会去对消息进行处理,处理过程中会回调自身Handler,HandleMessage方法。从而实现了不同线程间通信。
2)Looper实现原理:Looper类里面包含一个消息队列对象和一个线程对象。当创建Looper时,会自动创建一个消息队列,同时将内部线程对象指向创建Looper的线程。当开启Looper后(Looper.loop()),会自动进入无限for循环中,不断去遍历消息队列,如果没有消息则阻塞,有消息则回调Handler的handleMessage()方法进行处理。
3)Looper.prepare():首先,要使用Looper机制一般会在当前线程中创建Handler对象,里面会自动创建一个Looper对象和消息队列,这里面的消息队列属于当前线程空间。但此时的Looper还不会去遍历,也没有绑定到当前线程。其中,Looper对象内部也包含一个空消息队列对象和空线程。通过Looper.prepare()方法,先让该消息队列指向当前线程的消息队列,让空线程也指向当前线程,从而实现了绑定。
38.【腾讯2015春招移动客户端开发练习卷】
简述Android如何处理UI与耗时操作的通信,有哪些方式及各自的优缺点。
理解:。。。
AsyncTask本质上是一个线程池,所有的异步任务都会在这个线程池中的工作线程中执行,当需要操作UI界面时,会和工作线程通过Handler传递消息。
更多推荐
所有评论(0)