常见Android⾯试题及答案(详细整理)
1. 请描述⼀下Activity ⽣命周期。
答: 如下图所⽰。共有七个周期函数,按顺序分别是: onCreate(), onStart(), onRestart(), onResume(), onPause(),onStop(), onDestroy()。onCreate(): 创建Activity时调⽤,设置在该⽅法中,还以Bundle的形式提供对以前存储的任何状态的访问。
onStart(): Activity变为在屏幕上对⽤户可见时调⽤。
onResume(): Activity开始与⽤户交互时调⽤(⽆论是启动还是重新启动⼀个活动,该⽅法总是被调⽤。
onPause(): Activity被暂停或收回cpu和其他资源时调⽤,该⽅法⽤户保护活动状态的,也是保护现场。
onStop(): Activity被停⽌并转为不可见阶段及后续的⽣命周期事件时调⽤。
onRestart(): Activity被重新启动时调⽤。该活动仍然在栈中,⽽不是启动新的Activity。
1、完整⽣命周期: 即从⼀个Activity从出现到消失,对应的周期⽅法是从onCreate()到onDestroy()。
2、可见⽣命周期: 当Activity处于可以⽤户看见的状态,但不⼀定能与⽤户交互时,将多次执⾏从onStart
()到onStop()。
3、前景⽣命周期: 当Activity处于Activity栈最顶端,能够与其他⽤户进⾏交互时,将多次执⾏从onResume()到onPause()。
2. 两个Activity之间跳转时必然会执⾏的是哪⼏个⽅法。
答: 两个Activity之间跳转必然会执⾏的是下⾯⼏个⽅法。
onCreate()//在Activity⽣命周期开始时调⽤。
onRestoreInstanceState()//⽤来恢复UI状态。
onRestart()//当Activity重新启动时调⽤。
onStart()//当Activity对⽤户即将可见时调⽤。
onResume()//当Activity与⽤户交互时,绘制界⾯。
onSaveInstanceState()//即将移出栈顶保留UI状态时调⽤。
onPause()//暂停当前活动Activity,提交持久数据的改变,停⽌动画或其他占⽤GPU资源的东西,由于下⼀个Activity在这个⽅法返回之前不会resume,所以这个⽅法的代码执⾏要快。
onStop()//Activity不再可见时调⽤。
onDestroy()//Activity销毁栈时被调⽤的最后⼀个⽅法。
3. 横竖屏切换时候Activity的⽣命周期。
答:
1、不设置Activity的android: configChanges时,切屏会重新调⽤各个⽣命周期,切横屏时会执⾏⼀次,切竖屏时会执⾏两次。
2、设置Activity的android: configChanges=“orientation”时,切屏还是会重新调⽤各个⽣命周期,切横、竖屏时只会执⾏⼀次。
3、设置Activity的android: configChanges=“orientation|keyboardHidden”时,切屏不会重新调⽤各个⽣命周期,只会执⾏onConfiguration⽅法
4. 如何将⼀个Activity设置成窗⼝的样式。
答: 第⼀种⽅法,在l⽂件中,可以新建如下的类似Dialog的style。
<style name=“Theme.FloatActivity” parent=“android:style/Theme.Dialog”> </style>。
第⼆种⽅法,在l中在需要显⽰为窗⼝的Activity中添加如下属性: android: theme=“@style/Theme.FloatActivity”即可。也
可以直接添加对应需要展⽰为Dialog style的Activity的android: theme属性为android: theme=“@ android: style/Theme.Dialog”。
5. 两个Activity之间怎么传递数据?
答: 可以在Intent对象中利⽤Extra来传递存储数据。
在Intent的对象请求中,使⽤putExtra(“键值对的名字”,”键值对的值”);在另外⼀个Activity中将Intent中的请求数据取出来:
Intent intent = getIntent();
String value = StringExtra(“testIntent”);
6. 怎么让在启动⼀个Activity是就启动⼀个service?
答: ⾸先定义好⼀个service,然后在Activity的onCreate⾥⾯进⾏连接并bindservice或者直接startService。
7. Activity怎么和service绑定,怎么在activity中启动⾃⼰对应的service?
答:
1、activity能进⾏绑定得益于Serviece的接⼝。为了⽀持Service的绑定,实现onBind⽅法。
2、Service和Activity的连接可以⽤ServiceConnection来实现。需要实现⼀个新的ServiceConnection,重现onServiceConnected和OnServiceDisconnected⽅法,⼀旦连接建⽴,就能得到Service实例的引⽤。
3、执⾏绑定,调⽤bindService⽅法,传⼊⼀个选择了要绑定的Service的Intent(显⽰或隐式)和⼀个你实现了的ServiceConnection的实例
8.什么是Service以及描述下它的⽣命周期。Service有哪些启动⽅法,有什么区别,怎样停⽤Service?
答: Android Service是运⾏在后台的代码,不能与⽤户交互,可以运⾏在⾃⼰的进程,也可以运⾏在其他应⽤程序进程的上下⽂⾥。需要通过某⼀个Activity或者Context对象来调⽤。Service有两个启动⽅法,分别是Context.startService()和Context.bindService()。如果在Service 执⾏耗时的操作需要启动⼀个新线程来执⾏。
Android Service只继承了onCreate(), onStart(),onDestroy()三个⽅法,当我们第⼀次启动Service时,先后调⽤onCreate(), onStart()这两个⽅法,当停⽌Service时,则执⾏onDestroy()⽅法时。如果Service已经启动了,当我们再次启动Service时,不会再执⾏onCreate()⽅法,⽽是直接执⾏onStart()⽅法。
9. 什么时候使⽤Service?
答: ⽐如播放多媒体的时候,⽤户启动了其他Activity,这个时候程序要在后台继续播放,⽐如检测SD卡上⽂件的变化,再或者在后台记录你的地理信息位置的改变等等。
安卓intent用法10. 请描述⼀下Intent 和 Intent Filter。
答: Intent在Android中被翻译为”意图”,他是三种应⽤程序基本组件-Activity,Service和broadcast receiver之间相互激活的⼿段。在调⽤Intent名称时使⽤ComponentName也就是类的全名时为显⽰调
⽤。这种⽅式⼀般⽤于应⽤程序的内部调⽤,因为你不⼀定会知道别⼈写的类的全名。⽽Intent Filter是指意图过滤,不出现在代码中,⽽是出现在android Manifest⽂件中,以<intent-filter>的形式。(有⼀个例外是broadcast receiver的intent
filter是使⽤isterReceiver()来动态设定的,其中intent filter也是在代码中创建的)
⼀个intent有action,data,category等字段。⼀个隐式intent为了能够被某个intent filter接收,必须通过3个,⼀个intent为了被某个组件接收,则必须通过它所有的intent filter中的⼀个。
11. Intent传递数据时,可以传递哪些类型数据?
答: intent间传送数据⼀般有两种常⽤的⽅法: 1、extra 2、data。
extra可以⽤Intent.putExtra放⼊数据。新启动的Activity可⽤Extras取出Bundle,然后⽤
Data则是传输url。url可以是指我们熟悉的http,ftp等⽹络地址,也可以指content来指向ContentProvider提供的资源。Intent.setData可以放
⼊数据,Data可以取出数据。
12. 说说Activity,Intent,Service是什么关系?
答: ⼀个Activity通常是⼀个单独的屏幕,每⼀个Activity都被实现为⼀个单独的类,这些类都是从Activity基类中继承⽽来的。Activity类会显⽰由视图控件组成的⽤户接⼝,并对视图控件的事件做出响应。
Intent的调⽤是⽤来进⾏屏幕之间的切换。Intent描述应⽤想要做什么。Intent中两个最重要的部分是动作和动作对应的数据,⼀个动作对应⼀个动作数据。
Service是运⾏在后台的代码,不能与⽤户交互,可以运⾏在⾃⼰的进程⾥,也可以运⾏在其他应⽤程序进程的上下⽂⾥。需要⼀个Activity 或者其他Context对象来调⽤。
Activity跳转Activity,Activity启动Service,Service打开Activity都需要Intent表明意图,以及传递参数,Intent是这些组件间信号传递的承载着。
13. 请描述⼀下BroadcastReceiver。
答: Broadcast Receiver⽤于接收并处理⼴播通知(broadcast announcements)。多数的⼴播是系统发起的,如地域变换、电量不⾜、来电短信等。程序也可以播放⼀个⼴播。程序可以有任意数量的broadcast receivers来响应它觉得重要的通知。Broadcast receiver可以通过多种⽅式通知⽤户: 启动ac
tivity、使⽤NotificationManager、开启背景灯、振动设备、播放声⾳等,最典型的是在状态栏显⽰⼀个图标,这样⽤户就可以点它打开看通知内容。通常我们的某个应⽤或系统本⾝在某些事件(电池电量不⾜、来电短信)来临时会⼴播⼀个Intent出去,我们利⽤注册⼀个broadcast
receiver来监听这些Intent并获取Intent中的数据。
14. 在manifest和代码中如何注册和使⽤ broadcast receiver 。
答: 在android的manifest中注册
<receiver android: name =“Receiver1”>
<intent-filter>
<!----和Intent中的action对应--->
<actionandroid: name=“com.broadcast”/>
</intent-filter>
</receiver>
在代码中注册
1、 IntentFilter filter = new IntentFilter(“com.broadcast”);//和⼴播中Intent的action对应;
2、 MyBroadcastReceiver br= new MyBroadcastReceiver();
3、 registerReceiver(br, filter);
15. 请介绍下ContentProvider是如何实现数据共享的。
答: ⼀个程序可以通过实现⼀个Content provider的抽象接⼝将⾃⼰的数据完全暴露出去,⽽且Content provider是以类似中的表的⽅式将⾃⼰的数据暴露。Content provider存储和检索数据,通过它可以让所有的应⽤程序访问到,这也是应⽤程序之间唯⼀共享数据的⽅法。
要想使应⽤程序的数据公开化,可通过2种⽅法:创建⼀个数据⾃⼰的Content Provider或者将你的数据添加到⼀个已经存在的Content Provider中,前提是有相同数据类型并且有写⼊Content Provider的权限,Android提供了Content Resolverr,外界的程序可以通过Content Resolver接⼝访问Content Provider提供的数据。
16. 请介绍下Android的数据存储⽅式。
答: Android提供了5中存储数据的⽅式,分别是以下⼏种
1、使⽤Shared Preferences存储数据,⽤来存储key-value,pairs格式的数据,它是⼀个轻量级的键值存储机制,只可以存储基本数据类型。
2、使⽤⽂件存储数据,通过FileInputStream和FileOutputStream对⽂件进⾏操作。在Android中,⽂件是⼀个应⽤程序私有的,⼀个应⽤程序⽆法读写其他应⽤程序的⽂件。
3、使⽤SQLite数据库存储数据,Android提供的⼀个标准数据库,⽀持SQL语句。
4、使⽤Content Provider存储数据,是所有应⽤程序之间数据存储和检索的⼀个桥梁,它的作⽤就是使得各个应⽤程序之间实现数据共享。它是⼀个特殊的存储数据的类型,它提供了⼀套标准的接⼝⽤来获取数据,操作数据。系统也提供了⾳频、视频、图像和个⼈信息等⼏个常⽤的Content Provider。如果你想公开⾃⼰的私有数据,可以创建⾃⼰的Content Provider类,或者当你对这些数据拥有控制写⼊的权限时,将这些数据添加到Content Provider中实现共享。外部访问通过Content Resolver去访问并操作这些被暴露的数据。
5、使⽤⽹络存储数据
17. 请介绍下Android中常⽤的五种布局。
答: 最常⽤的布局⽅式为Absolute Layout、Relative Layout、Linear Layout、FrameLayout、TableLayout。其中Linear Layout和Relative Layout是最常⽤的⽅式,他们可以通过在xml配置⽂件或者代码中进⾏布局。
1、Frame Layout是最简单的布局⽅式,放置的控件都只能罗列到左上⾓,控件会有重叠,不能进⾏复杂的布局。
2、Linear Layout可以通过orientation属性设置线性排列的⽅向是垂直还是纵向的,每⾏或每列只有⼀个元素,可以进⾏复杂的布局。
3、Absolute Layout可以让⼦元素指定准确的x、y坐标值,并显⽰在屏幕上。Absolute Layout没有页边框,允许元素之间相互重叠。它是绝对坐标,所以在实际中不提倡使⽤。
4、Relative Layout允许⼦元素制定他们相对于其他元素或⽗元素的位置(通过ID制定)。因此,你可以以右对齐,或上下,或置于屏幕中央的形式来排列两个元素。元素按顺序排列,因此如果第⼀个元素在屏幕的中央,那么相对于这个元素的其他元素将以屏幕中央的相对位置来排列。这个是相对于Absolute Layout的,采⽤相对坐标,所以在实际中⽐较常⽤。
5、Table Layout将以⼦元素的位置分配到⾏或列。⼀个Table Layout由许多的Table Row组成,每个Ta
ble Row都会定义⼀个row。Table Layout容器不会显⽰row、column或者cell的边线框。每个row拥有0个或多个的cell;和html中的table差不多。在实际中也经常使⽤。18. 谈谈UI中, Padding和Margin有什么区别?
答: Padding是控件的内容相对控件的边缘的边距,⽽Margin是控件边缘相对于其他控件的边距。如下图所⽰:
19. android本⾝的⼀些限制,⽐如apk包⼤⼩限制,读取⼤⽂件时的时间限。
答:apk包⼤⼩限制不好说,有的apk为100M,还是能装到⼿机上。⼀般的apk⼤⼩为5~10M左右。读取⼤⽂件的时间应该是在main线程⾥⾯,时间限制为5秒左右。
20. ListView如何提⾼其效率?
答:1、使⽤分页加载,不要⼀次性加载所有数据。
2、复⽤convertView。在getItemView中,判断converView是否为空,如果不为空,可复⽤。
3、异步加载图⽚。Item中如果包含有webimage,那么最好异步加载。
4、快速滑动时,不显⽰图⽚。当快速滑动列表(SCROLL_STATE_FLING),item中的图⽚或获取需要消耗资源的view,可以不显⽰出来;⽽处于其他两种状态(SCROLL_STATE_IDLE和SCROLL_STATE_TOUCH_SCROLL),则将那些view显⽰出来
21. Android程序与程序的区别?
区别Java程序Android程序
执⾏⼊⼝点Main l配置⽂件中的intent-filter
UI Frame·Activity
是否基于配置⽂件否是
是否基于组件否是Activity,Service,Broadcast Receiver,Content Provider
22. 谈谈对Android NDK的理解。
答: android NDK是⼀套⼯具,允许Android应⽤开发者嵌⼊从C、C++源代码编译来的本地机器代码到各⾃的应⽤软件包中。
1、 NDK是⼀系列⼯具的集合。
NDK提供了⼀系列的⼯具,帮助开发者快速开发C(或C++)的动态库,并能⾃动将so和java应⽤⼀起打包成apk。这些⼯具对开发者帮助时巨⼤的。
NDK集成了交叉编辑器,并提供了相应的mk⽂件隔离CPU、平台、API等差异,开发⼈员只需要简单修改mk⽂件(指出“那些⽂件需要编译”、“编译特性要求”等),就可以创建出so。NDK可以⾃动将so和Java应⽤⼀起打包,极⼤的减轻了开发⼈员的打包⼯作。
2、NDK提供了⼀份稳定、功能有限的API头⽂件声明。这些API⽀持的功能⾮常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、log库(liblog)。
23. 谈谈Android的优点和不⾜之处。
答: 优点如下所⽰:
1、android是开源、市场占有率⼤。
2、android能够有丰富的硬件选择。
3、android是⼀款基于平台的开源,从⽽避免了专利壁垒,是⼀款完全免费的只能⼿机平台。
4、由于android是google开发的,因此能够⽆缝结合Google应⽤。
缺点如下所⽰:
1、安全与隐私。⼿机与互联⽹紧密联系,个⼈隐私很难得到保守。
24. Android系统中GC什么情况下会出现内存泄露呢?
答: 导致内存泄露主要的原因是,先前申请了内存空间⽽忘记了释放。如果程序中存在⽆⽤对象的引⽤,那么这些对象就会驻留内存,消耗内存,因为⽆法让垃圾回收器GC验证这些对象是否不再需要。如果存在对象的引⽤,这个对象就被定义为“有效的活动”,同时不会被释放。要确定对象所占内存将被回收,我们就要确认该对象不会再被使⽤。典型的做法是把对象数据成员设为null或者从集合中移除该对象。当出现以下情况时,会造成内存泄露:
1、数据库的cursor没有关闭。
2、构造adapter时,没有使⽤缓存contentview。
3、 Bitmap对象不使⽤时,采⽤recycle()释放内存。
4、 Activity中的对象的⽣命周期⼤于activity。
调试⽅法: DDMS==>HEAPSIZE==>dataobject==>[TotalSize]
25. Android UI中的View如何刷新。
答: Android中对View的更新⽅式有很多种,使⽤时要区分不同的应⽤场合。要分清的是:多线程和双缓冲。
1、不使⽤多线程和双缓冲
这种情况最简单,⼀般只希望View在发⽣改变时对UI进⾏重绘。你只需要Activity中显式调⽤View对象中的invalidate()⽅法即可。系统会⾃动调⽤View的onDraw()⽅法。
2、使⽤多线程和不使⽤双缓冲
这种情况下需要开启新的线程,新开的线程就不好访问View对象了。强⾏访问的话会报错:android.view.ViewRoot$ CalledFromWrongThreadException: only theoriginal thread that created a view hierarchy can touch its views。
这时候你需要创建⼀个继承了android.os.handler的⼦类,并重写handleMessage⽅法。Android.os.Handle是能发送和处理消息的,你需要在Activity中发出更新UI的消息,然后再你的Handle
r(可以使⽤匿名内部类)中处理消息(因为匿名内部类可以访问⽗类变量,你可以直接调⽤View对象中的invalidate()⽅法。也就是说:在新线程中创建并发送⼀个Message,然后在主线程中捕获、处理该消息。
3、使⽤多线程和双缓冲
Android的SurfaceView是View的⼦类,她同时也实现了双缓冲。你可以定义⼀个她的⼦类并实现Surfaceholder.Callback接⼝。由于
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论