Android面试题总结1

本文深入探讨了Android应用中的关键组件,包括Activity、Intent、ContentProvider、Service及其区别,同时详细阐述了BroadcastReceiver的工作原理及使用方法。此外,文章还介绍了ContentProvider在数据共享中的作用,并解释了try-finally语句中的返回语句执行流程,以及在Java内存管理中的栈和堆概念。同时,讨论了finally块内的代码执行时机,以及字符串实例化过程中的String Pool机制。最后,文章涉及了Handler机制的原理、JNI接口跨线程调用的实现方法、以及Android程序内存优化和APK文件大小控制的技巧。

1.Android中Activity,intent,content provider,service各有什么区别?

Activity是Android应用中负责与用户交互的组件——大致上把它想象成Swing编程中的JFrame控件。不过它与JFrame的区别在于:JFrame本身可以设置布局管理器,不断地向JFrame中添加组件,但Activity只能通过setContentView(View)来显示指定组件。

Activity为Android应用提供里可视化用户界面,如果该Android应用需要多个用户界面,那么这个Android应用将会包含多个Activity,多个Activity组成Activity栈。当前活动的Activity位于栈顶。
View组件是所有UI空间,容器空间的基类,View组件就是Android应用中用户实实在在看到的部分。但View组件需要防盗容器组件中,或者使用Activity将它显示出来。如果需要通过某个Activity把指定View显示出来,调用Activity的SetContenView()方法即可。

 

service:Android四大组件之一,与Activity的区别在于:Service通常位于后台运行,一般不需要与用户交互,因此Service组件没有图形用户界面。Service组件需要继承Service基类。一个Service组件被运行起来之后,它将拥有自己独立的生命周期,Service组件通常用于为其他组件提供后台服务或监控其他组件的运行状态。

 

BroadcastReceiver 是Android应用中另一个重要组件,广播消息接收器。从代码实现角度来看,BroadcastReceiver非常类似于事件编程中的监听器。与普通事件监听器不同的是:普通事件监听器监听的事件源是程序中的对象;而BroadcastReciver监听的事件源是Android应用中的其他组件。使用BroadcastReceiver组件接受广播消息比较简单,开发者只要实现自己的BroadcastReciver子类,并重写OnReceive(Context context,Intent intent)方法即可。当其他组件通过sendBroadcast()、sendSickyBroadcast()或sendOrderedBroadcast()方法发送广播时,如该BroadcastReceiver也对该消息“感兴趣”(通过IntentFilter配置)两种方式注册系统级的“事件监听器”
1.在java代码中通过Context。registReceiver()方法注册BroadcastReceiver。
2.在AndroidMainfest.xml文件中使用<receiver....>元素完成注册C

 

ContentProvider对于Android应用而言,组件必须相互杜丽,如果这些Android应用之间需要实现实时的数据交换。例如发送短信的程序,当发送短信时需要从联系人管理应用中读取指定联系人数据,这就需要多个应用程序进行实时的数据交换。
一个程序可以通过实现一个Content provider的抽象接口将自己的数据完全暴露出去,而且Content providers是以类似数据库中表的方式将数据暴露。Content providers存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。要想使应用程序的数据公开化,可通过2种方法:创建一个属于你自己的Content provider或者将你的数据添加到一个已经存在的Content provider中,前提是有相同数据类型并且有写入Content provider的权限。
 


2.try()里有一个return语句,那么紧跟这个try后的finally()里的code会不会被执行,什么时候执行,在return前还是后?

在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。在转去之前,try中先把要返回的结果存放到不同于a的局部变量中去,执行完finally之后,在从中取出返回结果,因此,即使finally中对变量a进行了改变,但是不会影响返回结果。它应该使用栈保存返回值
stack(栈区): 由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间
heap(堆区): 需要程序员自己申请,并指明大小
java的内存分为两类,一类是栈内存,一类是堆内存。栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。

堆是与栈作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,例如,使用new创建的对象都放在堆里,所以,它不会随方法的结束而消失。方法中的局部变量使用final修饰后,放在堆中,而不是栈中。

这个例子就能懂了
public class FinallyTest {
 public static void main(String[] args) {
  System.out.println(new FinallyTest().test());
  ;
 }

 static int test() {
  int x = 1;
  try {
   x++;
   System.out.println(x+"...");
   return x;
  } finally {
   ++x;
   System.out.println(x+"...........");
  }
 }
}


 

3.String s=new String("123"); 这个语句创建了几个Atring Object?

2个,首先在String池中找,找到?不创建string对象,否则创建对象。遇到new运算符号了,在内存上创建string对象,并将其返回给s。又一个对象。
引用对象s,字符串对象“xyz”

 

4.简单阐述handler机制的原理。

android提供了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。
handler来控制消息队列,在主线程里实体化handler对象,定义handmessage方法,在子线程里向handler对象发送消息,在主线程中的handmessage方法中处理消息,实现异步。


5.为了释放android程序的内存使用峰值和apk文件的大小,我们一般使用___9patch____工具对资源图进行额外处理。

 

6.Android系统会自动触发各种事件,事件从触发到相应的程序响应的触发顺序是___.EventHub->KeyInputQueue->WindowManagerService->ViewRoot->PhoneWindow->Activity->ContentView______________。

 

7.发布Android程序时,apk文件要先签名在用zipalign做4字节对齐,判断对错(对)。

 

8.实现多个进程共享数据是,只要设置Manifest文件的ShareUserid属性即可,签名可以不一致。判断对错(是)。

9.在JNI的实现代码中,如果要实现跨线程调用JNI接口,我们需要先调用jni.h中的__GetJavaVM______函数,跨线程调用JNI接口完毕后,在调用jni.h中的_ DestroyJavaVM____函数来善后。

10.Android中的动画有哪几类,他们的特点和区别是什
么?
android支持两种动画模式,tween animation,frame animation   View Animation(Tween Animation):补间动画,给出两个关键帧,通过一些算法将给定属性值在给定的时间内在两个关键帧间渐变。  View animation只能应用于View对象,而且只支持一部分属性,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化.          另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。

11.请阐述一下Activity的生命周期。
在一个Activity正常启动的过程中,他们被调用的顺序是 onCreate -> onStart -> onResume, 在Activity被干掉的时候顺序是onPause -> onStop -> onDestroy ,这样就是一个完整的生命周期
详细介绍一下这几个方法中系统在做什么以及我们应该做什么:
 
  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都有可能被系统干掉


 

12.请解析一下在单线程中message,Handler.......之间的关系。

简单的说,Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有Handler进行Message的分发和处理.

13.AIDL的全称是什么,它是如何工作的?(等等,全方面了解一下)
AIDL全称Android Interface Definition Language(AndRoid接口描述语言) 是一种借口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程跨界对象访问的目的.AIDL的IPC的机制和COM或CORBA类似, 是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相关类.; 2. 调用aidl产生的class.理论上, 参数可以传递基本数据类型和String, 还有就是Bundle的派生类, 不过在Eclipse中,目前的ADT不支持Bundle做为参数,
1

4.Manifest.xml文件中主要包含哪些信息?
A、xmlnsandroid

定义android命名空间,一般为http://schemas.android.com/apk/res/android,这样使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据。


B、package

指定本应用内java主程序包的包名,它也是一个应用进程的默认名称


C、sharedUserId

表明数据权限,因为默认情况下,Android给每个APK分配一个唯一的UserID,所以是默认禁止不同APK访问共享数据的。若要共享数据,第一可以采用Share Preference方法,第二种就可以采用sharedUserId了,将不同APK的sharedUserId都设为一样,则这些APK之间就可以互相共享数据了。详见:http://wallage.blog.163.com/blog/static/17389624201011010539408/

D、sharedUserLabel

一个共享的用户名,它只有在设置了sharedUserId属性的前提下才会有意义


E、versionCode

是给设备程序识别版本(升级)用的必须是一个interger值代表app更新过多少次,比如第一版一般为1,之后若要更新版本就设置为2,3等等。。。


F、versionName

这个名称是给用户看的,你可以将你的APP版本号设置为1.1版,后续更新版本设置为1.2、2.0版本等等。。。


G、installLocation

安装参数,是Android2.2中的一个新特性,installLocation有三个值可以选择:internalOnly、auto、preferExternal

选择preferExternal,系统会优先考虑将APK安装到SD卡上(当然最终用户可以选择为内部ROM存储上,如果SD存储已满,也会安装到内部存储上)

选择auto,系统将会根据存储空间自己去适应

选择internalOnly是指必须安装到内部才能运行

(注:需要进行后台类监控的APP最好安装在内部,而一些较大的游戏APP最好安装在SD卡上。现默认为安装在内部,如果把APP安装在SD卡上,首先得设置你的level为8,并且要配置android:installLocation这个参数的属性为preferExternal)

 

16.android的优势与不足
5大优势:一,开放性。开发的平台允许任何移动终端厂商加入到Android联盟中来,有利于积累人气,这里的人气包括消费者和厂商。消费者可以用更低的价格买到心仪的手机
二。挣脱运营商的束缚
三。丰富的硬件选择
四,不受任何限制的开发商
五,无缝结合的Google应用
五大不足:安全和隐私,同类机型用户减少。运营商仍然能够影响到Android手机。

17.描述一下android的系统架构
 
android系统架构分从下往上为linux 内核层、运行库、应用程序框架层、和应用程序层

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值