安卓面试题库

1.什么是Activity? 

通俗一点说Activity就是一个界面,这个界面里面可以放置各种控件。Activity的界面也是用xml文件表示的,放置在res->layout下面。每生成一个新的Activity后,我们需要在AndroidManifest.xml中注册一下这个activity。

2.请描述一下Activity生命周期。
onCreate(Bundle savedInstanceState):
创建activity时调用。设置在该方法中,还以Bundle的形式提供对以前储存的任何状态的访问!  

onStart():activity变为在屏幕上对用户可见时调用。  

onResume():activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。  

onPause():activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧!  

onStop():activity被停止并转为不可见阶段及后续的生命周期事件时调用。  

onRestart():重新启动activity时调用。该活动仍在栈中,而不是启动新的活动。  onDestroy():activity被完全从系统内存中移除时调用,该方法被调用

 **3.两个Activity之间跳转时必然会执行的是哪几个方法?**
onCrante()//在Activity生命周期开始时调用 

onRestoreInstanceState()//用来恢复UI状态 

onReStart()//当Activity重新启动时调用 

onStart()//Activity对用户即将可见时调用 

onResume()//当Activity与用户交互时,绘制界面 

onSaveInstanceState()//activity即将移出栈顶保留UI状态时调用 

onPause()//暂停当前活动activity,提交持久数据的改变,停止动画和其他占用CPU资源的东西,由于下一个activity在这个方法返回之前不会resume,所以这个方法的代码执行要快。 

onStop()//activity不再可见时调用 

onDestroy()//在Activity销毁钱被调用的最后一个方法。

4.横竖屏切换时候Activity的生命周期。

1、不设置Activity的属性

1
android:configChanges

切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次 。

2、设置Activity的属性

android:configChanges="orientation"

切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次 

3、设置Activity的属性

android:configChanges="orientation|keyboardHidden"

切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法 

5. 如何将一个Activity设置成窗口的样式。

1、在你的styles.xml文件中可以新建一如下的类似Dialog的style 

1
<style name="Theme.FloatActivity" parent="android:style/Theme.Dialog">  </style>

 
2、在AndroidManifest.xml中在你需要显示为窗口的activity中添加如下属性:
android:theme="@style/Theme.FloatActivity" 

也可以直接添加您对应需要展示为 Dialog style的Activity的android:theme属性值为 

1
android:theme="@android:style/Theme.Dialog"

6.你后台的Activity被系统回收怎么办?

系统会帮我们记录下回收前Activity的状态,再次调用被回收的Activity就要重新调用
onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数savedInstanceState。savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象,我们使用savedInstanceState可以恢复到回收前的状态。

7. 如何退出Activity?如何安全退出已调用多个Activity的Application?

用finish()方法退出activity. 

在2.1之前,可以使用ActivityManager的restartPackage方法。 
它可以直接结束整个应用。在使用时需要权限android.permission.RESTART_PACKAGES。 

在2.2,这个方法失效了,可使用以下几个人工的方法 1、记录打开的Activity: 
每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。 2、发送特定广播: 
在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。

8. 如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?

被回收前调用onSaveInstanceState()方法保存当前状态。

 两个Activity之间怎么传递数据? 
在Intent的对象中增加要传递的参数既可。  在Intent的对象的请求中加入键值对,对象名字.putExtra("键值对的名字","键值对的值");  在另一个Activity中将Intent请求中的数据取出来:   Intent intent=getIntent();// 
  String value = intent.getStringExtra("testIntent");//将testIntent对应的值赋值给value  
   怎么在启动一个Activity时就启动一个service? 将启动Service的语句放在onCreate()方法中。 
 
   同一个程序,但不同的Activity是否可以放在不同的Task任务栈中? 
可以放在不同的Task中。需要为不同的activity设置不同的taskaffinity属性,启动activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK标记。 
 
   Activity怎么和service绑定,怎么在activity中启动自己对应的service? 1、Activity能进行绑定得益于Service的接口。为了支持Service的绑定,实现onBind方法。 2、Service和Activity的连接可以用ServiceConnection来实现。你需要实现一个新的ServiceConnection,重写onServiceConnected和onServiceDisconnected方法,一旦连接建立,你就能得到Service实例的引用。 
3、执行绑定,调用bindService方法,传入一个选择了要绑定的Service的Intent(显式或隐式)和一个你实现了的ServiceConnection实例

 什么是Service以及描述下它的生命周期。 
Android Service是运行在后台的代码,不能与用户交互,可以运行在自己的进程,也可以运行在其他应用程序进程的上下文里。需要通过某一个Activity或者其他Context对象来调用, Context.startService() 和 Context.bindService()。  如果在Service执行耗时的操作需要启动一个新线程来执行。 
Android Service只继承了onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行
onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启Service时,不会在执行onCreate()方法,而是直接执行onStart()方法。 
 
   Service有哪些启动方法,有什么区别,怎样停用Service? 
两种启动Service的方式Context.startService() 和 Context.bindService()。 区别
为 Context.startService():Service会经历onCreate -> onStart(如果Service还没有运行,则android先调用onCreate()然后调用onStart();如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次 );stopService的时候直接
onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service 
  Context.bindService():Service会经历onCreate() -> onBind(),onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind -> onDestroyed相应退出,所谓绑定在一起就共存亡了 。 
停用service使用 context.stopService() 
 
   不用service,B页面为音乐播放,从A跳转到B,再返回,如何使音乐继续播放? a 使用startActivityForResult() 方法开启b,b类结束时调用finish(); 
a类的intent有一个子activity结束事件onActivityResult(),在事件里继续播放音乐  
   什么是IntentService?有何优点? 
IntentService也是一个Service,是Service的子类, 
IntentService和Service有所不同,通过Looper和Thread来解决标准Service中处理逻辑的阻塞问题。 
 
优点:Acitivity的进程,当处理Intent的时候,会产生一个对应的Service Android的进程处理器现在会尽可能的不kill掉你 非常容易使用 
日历中IntentService的应用    什么时候使用Service? 
比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记 录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的。  
 
   请描述一下Intent 和 Intent Filter。

FrameLayout 最简单的布局方式,放置的控件都只能罗列到左上角,控件会有重叠,不能进行复杂的布局。  
LinearLayou可以通过orientation属性设置线性排列的方向是垂直(vertical)还是纵向(horizontal).每行或每列只有一个元素,可以进行复杂的布局。  AbsoluteLayout 可以让子元素指定准确的x/y坐标值,并显示在屏幕上。AbsoluteLayout 没有页边框,允许元素之间互相重叠(尽管不推荐)。他是绝对坐标,所以在实际中不提倡使用。  
RelativeLayout 允许子元素指定他们相对于其它元素或父元素的位置(通过ID 指定)。因此,你可以以右对齐,或上下,或置于屏幕中央的形式来排列两个元素。元素按顺序排列,因此如果第一个元素在屏幕的中央,那么相对于这个元素的其它元素将以屏幕中央的相对位置来排列。这个是相对于 AbsoluteLayout 的,采用的相对坐标,所以在实际中比较常用。  TableLayout 将子元素的位置分配到行或列中。一个TableLayout 由许多的TableRow 组成,每个TableRow 都会定义一个 row 。TableLayout 容器不会显示row 、column或cell 的边框线。每个 row 拥有0个或多个的cell ;和html中的table差不多。在实际中也经常使用。  
  有的时候我们也会用到GridView,就像我们手机屏幕上摆放的各个图标应该就是用GridView排版的。 Padding是文字相对于边框,而Margin是边框相对于父窗体。   
   谈谈UI中, Padding和Margin有什么区别? 
Padding是文字相对于边框,而Margin是边框相对于父窗体。  
   widget相对位置的完成在antivity的哪个生命周期阶段实现。 
  
   请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。  
   AIDL的全称是什么?如何工作?能处理哪些类型的数据? 
AIDL是一种接口定义语言,用于约束两个进程间的通信规则,供编译器生成代码,实现Android设备上的进程间通信。 
进程之间的通信信息首先会被转换成AIDL协议消息,然后发送给对方,对方受到AIDL协议消息后再转换成相应的对象。 
AIDL支持的类型包括Java基础类型和String,List,Map,CharSequence,如果使用自定义类型,必须实现Parcelable接口。 
 
   请解释下Android程序运行时权限与文件系统权限的区别。 运行时 Dalvik( android授权)  文件系统 linux 内核授权 
 
   系统上安装了多种浏览器,能否指定某浏览器访问指定页面? 
在action 赋值为”android.intent.action.VIEW“  时可接收如下scheme 为"http" 等等类型的data 。所以突发奇想,启动该程序后,指定action 及Uri ,即访问指定网页。  
   对多线程的运用和理解,及多线程之间handle的传值。 

   对android虚拟机的理解,包括内存管理机制垃圾回收机制。 
 
   Framework工作方式及原理,Activity是如何生成一个view的,机制是什么。   
    android本身的一些限制,比如apk包大小限制,读取大文件时的时间限。 
  
   如何加载的音乐信息,如何改善其效率。 
Android系统提供了MediaScanner,MediaProvider,MediaStore等接口,并且提供了一套数据库表格,通过Content Provider的方式提供给用户。当手机开机或者有SD卡插拔等事件发生时,系统将会自动扫描SD卡和手机内存上的媒体文件,如audio,video,图片等,将相应的信息放到定义好的数据库表格中。 
改善效率可以从界面需要查询必备数据,不需要的不进行查询。  
   ListView如何提高其效率? 
使用分页加载,不要一次性加载所有数据。 
 
   启动应用后,改变系统语言,应用的语言会改变么? 不会 
   启动一个程序,可以主界面点击图标进入,也可以从一个程序中跳转过去,二者有什么区别? 
从主界面启动一个应用程序是通过快捷方式直接调用mainActivity启动的,从其他应用程序调用需要隐式的通过Action或者在Intent中需要使用setClass(),且要写明包路径。  
   Android程序与Java程序的区别? 
android程序是Java编写的,但程序使用的android开发的API,就是andriod的库。   
   Android中Task任务栈的分配。 
   在Android中,怎么节省内存的使用,怎么主动回收内存?    不同工程中的方法是否可以相互调用? 
   在Android中是如何实现判断区分通话记录中的电话状态,去电,来电、未接来电?    dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念 
DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的 Dalvik虚拟机实例.而每一个DVM都是在Linux中的一个进程,所以说可以认为是同一个概念.  
 
   sim卡的EF 文件有何作用 
SIM卡的文件系统有自己规范,主要是为了和手机通讯,SIM卡本身可以有自己的操作系统,EF就是作存储并和手机通讯用的。 
 
   如何判断是否有SD卡? 
在程序中访问SDCard,你需要申请访问SDCard的权限。 

在AndroidManifest.xml中加入访问SDCard的权限如下:  
  
    Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) Environment.getExternalStorageState()方法用于获取SDCard的状态,如果手机装有
SDCard,并且可以进行读写,那么方法返回的状态等于Environment.MEDIA_MOUNTED。   
   嵌入式操作系统内存管理有哪几种, 各有何特性。 
   什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?    一条最长的短信息约占多少byte?     Linux中跨进程通信的几种方式 。    谈谈对Android NDK的理解。 
Android NDK是一套工具,允许Android应用开发者嵌入从C、C++源代码文件编译来的本地机器代码到各自的应用软件包中。 
 
   谈谈Android的优点和不足之处。 
   Android系统中GC什么情况下会出现内存泄露呢? 出现情况: 
1. 数据库的cursor没有关闭 
2.构造adapter时,没有使用缓存contentview 
   衍生listview的优化问题-----减少创建view的对象,充分使用contentview,可以使用一静态类来优化处理getview的过程/ 
3.Bitmap对象不使用时采用recycle()释放内存 4.activity中的对象的生命周期大于activity 
调试方法: DDMS==> HEAPSZIE==>dataobject==>[Total Size] 
  
   Android UI中的View如何刷新。 
一般只是希望在View发生改变时对UI进行重绘。你只需在Activity中显式地调用View对象中的invalidate()方法即可。系统会自动调用 View的onDraw()方法。 
 
   简单描述下Android 数字签名。    什么是ANR 如何避免它? 
   android中的动画有哪几类,它们的特点和区别是什么? 
两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。   
   handler机制的原理。 

Andriod提供了Handler和Looper来满足线程间的通信.Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(Message Exchange).  
  1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列).  
  2)Handler:你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息.   
 android中线程与线程,进程与进程之间如何通信。 线程通信使用Handler, 
 
   说说mvc模式的原理,它在android中的运用。 
MVC(Model_view_contraller)”模型_视图_控制器”。 MVC应用程序总是由这三个部分组成。Event(事件)导致Controller改变Model或View,或者同时改变两者。只要 Controller改变了Models的数据或者属性,所有依赖的View都会自动更新。类似的,只要Contro Android中各种界面的监听操作就是MVC的应用。 
 
   android中有哪几种解析xml的类,官方推荐哪种?以及它们的原理和区别。 DOM解析   优点: 
 
XML树在内存中完整存储,因此可以直接修改其数据和结构。 2.可以通过该解析器随时访问XML树中的任何一个节点。 3.DOM解析器的API在使用上也相对比较简单。 缺点: 
如果XML文档体积比较大时,将文档读入内存是非常消耗系统资源的。 使用场景: 
DOM 是用与平台和语言无关的方式表示 XML 文档的官方 W3C 标准。DOM 是以层次结构组织的节点的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能进行任何工作。DOM是基于对象层次结构的。  
SAX解析 优点: 
SAX 对内存的要求比较低,因为它让开发人员自己来决定所要处理的标签。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX 这种扩展能力得到了更好的体现。 缺点: 
用SAX方式进行XML解析时,需要顺序执行,所以很难访问到同一文档中的不同数据。此外,在基于该方式的解析编码过程也相对复杂。 使用场景: 
对于含有数据量十分巨大,而又不用对文档的所有数据进行遍历或者分析的时候,使用该方法十分有效。该方法不用将整个文档读入内存,而只需读取到程序所需的文档标签处即可。 Xmlpull解析 
android SDK提供了xmlpull api,xmlpull和sax类似,是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序。因为是基于流的处理,因此xmlpull和sax都比较节约内存资源,不会象dom那样要把所有节点以对橡树的形式展现在内存中。

xmlpull比sax更简明,而且不需要扫描完整个流。 
  
   DDMS与TraceView的区别?  
Traceview是android平台配备一个很好的性能分析的工具。它可以通过图形化的方式让我们了解我们要跟踪的程序的性能,并且能具体到method。 
http://wbdban.iteye.com/blog/564309DDMS为我们提供例如:为测试设备截屏,针对特定的进程查看正在运行的线程以及堆信息、 
   res目录有默认几项resource。 
6项,drawable-hdpi,drawable-ldpi,drawable-mdpi,layout,values。  
   android的哪个版本是一次重大的升级? 1、6版本。 系统新功能  
快速搜索框(全局搜索) 新的摄像机和照相机 电池用量指示 
Android Market(菜场)升级  新平台的新技术  
Android 1.6 升级Linux内核从2.6.27 到 2.6.29.   
NotifactionManager使用原理 
1. 通过getSystemService方法获得一个NotificationManager对象。 
  2. 创建一个Notification对象。每一个Notification对应一个Notification对象。在这一步需要设置显示在屏幕上方状态栏的通知消息、通知消息前方的图像资源ID和发出通知的时间。一般为当前时间。 
  3. 由于Notification可以与应用程序脱离。也就是说,即使应用程序被关闭,Notification仍然会显示在状态栏 中。当应用程序再次启动后,又可以重新控制这些Notification。如清除或替换它们。因此,需要创建一个PendingIntent对象。该对象由Android系统负责维护,因此,在应用程序关闭后,该对象仍然不会被释放。 
  4. 使用Notification类的setLatestEventInfo方法设置Notification的详细信息。   5. 使用NotificationManager类的notify方法显示Notification消息。在这一步需要指定标识Notification的唯一ID。这个ID必须相对于同一个NotificationManager对象是唯一的,否则就会覆盖相同ID的Notificaiton。


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值