zoukankan      html  css  js  c++  java
  • Android 面试精华题目总结

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24015867


    以下的题目都是楼主在android交流群大家面试时遇到的。假设大家有好的题目或者好的见解欢迎分享。楼主将长期维护此帖。



    某公司高级面试题(2015-03-14)【感谢helder分享】

    1、详述Android系统架构。包括层与层之间调用、binder、jni、底层文件读写方法

    2、描写叙述自己的一个项目,要求画出结构图,UML图,具体描写叙述项目种的技术点,技术难点以及解决方式

    3、一道算法

    4、谈谈自己项目管理的方法、对敏捷软件开发的理解


    基础面试题(2014-04-18)

    1、请解释下在单线程模型中Message,Handler,Message Queue,Looper之间的关系。

    拿主线程来说,主线程启动时会调用Looper.prepare()方法。会初始化一个Looper。放入Threadlocal中,接着调用Looper.loop()不断遍历Message Queue,

    Handler的创建依赖与当前线程中的Looper,假设当前线程没有Looper则必须调用Looper.prepare()。Handler , sendMessage到MessageQueue,Looper不断

    从MessageQueue中取出消息,回调handleMessage方法。


    2、假设有个100M大的文件,须要上传至server中,而serverform表单最大仅仅能上传2M,能够用什么方法。

    这个问题不是非常明白我觉得,首先来说使用http协议上传数据,特别在android下,跟form没什么关系。传统的在web中,在form中写文件上传,事实上浏览器所做

    的就是将我们的数据进行解析组拼成字符串,以流的方式发送到server。且上传文件用的都是POST方式。POST方式对大小没什么限制。

    回到题目,能够说假设每次真的仅仅能上传2M,那么可能我们仅仅能把文件截断,然后分别上传了。


    3、内存溢出和内存泄漏有什么差别?何时会产生内存泄漏?内存优化有哪些方法?

    内存溢出通俗理解就是软件(应用)运行须要的内存,超出了它可用的最大内存。

    内存泄漏就是我们对某一内存空间的使用,使用完毕后没有释放。

    内存优化:Android中easy内存溢出的部分,就是图片的载入。我们能够使用图片的压缩加上使用LruCache缓存的目的来控制图片所能够使用的内存。

    还有对于比較耗资源的对象及时的关闭。例如Database Conn , 各种传感器 , Service 等等。


    4、AsyncTask使用在哪些场景?它的缺陷是什么?怎样解决?

    AsyncTask 运用的场景就是我们须要进行一些耗时的操作,耗时操作完毕后更新主线程,或者在操作过程中对主线程的UI进行更新。

    缺陷:AsyncTask中维护着一个长度为128的线程池,同一时候能够运行5个工作线程,另一个缓冲队列。当线程池中已有128个线程,缓冲队列已满时,假设

    此时向线程提交任务,将会抛出RejectedExecutionException。


    解决:由一个控制线程来处理AsyncTask的调用推断线程池是否满了,假设满了则线程睡眠否则请求AsyncTask继续处理。


    5、Activity用SharedPreferences保存数据。大小有木有限制?

    这个真心查不到。。


    6、Activity间通过Intent传递数据大小有没有限制?

    貌似是40K。


    7、assest文件夹里放文件,对于文件的大小有没有限制?22

    assets文件夹更像一个附录类型的文件夹。Android不会为这个文件夹中的文件生成ID并保存在R类其中。因此它与Android中的一些类和方法兼容度更低。

    同一时候。由于你须要一个字符串路径来获取这个文件夹下的文件描写叙述符,訪问的速度会更慢。可是把一些文件放在这个文件夹下会使一些操作更加方便。

    例如说拷贝一个数据库文件到系统内存中。要注意的是。你无法在Android XML文件里引用到assets文件夹下的文件,仅仅能通过AssetManager来訪问

    这些文件。数据库文件和游戏数据等放在这个文件夹下是比較合适的。另外。网上关于assets和raw的资料都千篇一律了。因此关于这两者中单个文件

    大小不能超过1M的**错误**描写叙述也在传播。即假设读取超过1M的文件会报"Data exceeds UNCOMPRESS_DATA_MAX (1314625 vs 1048576)"的

    IOException,还引申出种种解决方式。个人觉得不应该有这种限制,为了验证这个说法写了个Demo,发现将近5M的压缩包在assets和raw中

    都能正常訪问,因此在这里纠正一下。理论上仅仅要打包不超过Android APK 50M大小的限制都是没有问题的。当然了,不排除是Android非常早期的

    时候由于设备硬件原因aapt在编译的时候对这两个文件夹大小做出了限制,假设是这样,较新版的ADT应该不会出现这种情况。

    来自:http://my.eoe.cn/futurexiong/archive/5350.html


    8、 启动一个程序。能够主界面点击图标进入,也能够从一个程序中跳转过去,二者有什么差别?

    是由于启动程序(主界面也是一个app)。发现了在这个程序中存在一个设置为<category android:name="android.intent.category.LAUNCHER" />的activity,

    所以这个launcher会把icon提出来。放在主界面上。当用户点击icon的时候,发出一个Intent:

    Intent intent = mActivity.getPackageManager().getLaunchIntentForPackage(packageName);

    mActivity.startActivity(intent);   

    跳过去能够跳到随意同意的页面,如一个程序能够下载,那么真正下载的页面可能不是首页(也有可能是首页),这时还是构造一个Intent。startActivity.

    这个intent中的action可能有多种view,download都有可能。

    系统会依据第三方程序向系统注冊的功能。为你的Intent选择能够打开的程序或者页面。

    所以唯一的一点

    不同的是从icon的点击启动的intent的action是相对单一的,从程序中跳转或者启动可能样式很多其它一些。本质是同样的。


    9、程序之间的亲和性的理解。

    1、默认情况下一个应用的全部Activity都是具有同样的affinity,都是从application中继承,application的affinity默认就是manifest的包名。

    2、affinity对Activity来说。就像是身份证一样。能够告诉所在的Task,自己属于其中的一员。

    3、应用场合:

    a:依据affinity又一次为Activity选择合适的宿主Task;

    b:与allowTaskReparenting属性配合;

    c:启动Activity使用Intent设置了FLAG_ACTIVITY_NEW_TASK标记。


    10、同一个程序,但不同的Activity能否够放在不同的Task任务栈中?

    能够放在不同的Task中。须要为不同的activity设置不同的affinity属性,启动activity的Intent须要包括FLAG_ACTIVITY_NEW_TASK标记。


    11、横竖屏切换时候Activity的生命周期。

    1、不设置Activity的android:configChanges时,切屏会又一次调用各个生命周期。切横屏时会运行一次,切竖屏时会运行两次

    2、设置Activity的android:configChanges="orientation"时,切屏还是会又一次调用各个生命周期,切横、竖屏时仅仅会运行一次

    3、设置Activity的android:configChanges="orientation|keyboardHidden"时。切屏不会又一次调用各个生命周期,仅仅会运行onConfigurationChanged方法


    12、AIDL的全称是什么?怎样工作?

    全称是:Android Interface Define Language

    在Android中, 每一个应用程序都能够有自己的进程. 在写UI应用的时候, 常常要用到Service. 在不同的进程中, 怎样传递对象呢? 显然, Java中不同意跨进程内存共享.

     因此传递对象, 仅仅能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象訪问的目的. 在J2EE中,採用RMI的方式, 能够通过序列化传递对象. 在Android中, 则

    採用AIDL的方式. 理论上AIDL能够传递Bundle,实际上做起来却比較麻烦。

    AIDL(AndRoid接口描写叙述语言)是一种借口描写叙述语言; 编译器能够通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 假设须要

    在一个Activity中, 訪问另一个Service中的某个对象, 须要先将对象转化成AIDL可识别的參数(可能是多个參数), 然后使用AIDL来传递这些參数, 在消息的接收端, 使用

    这些參数组装成自己须要的对象.AIDL的IPC的机制和COM或CORBA相似, 是基于接口的。但它是轻量级的。它使用代理类在client和实现层间传递值. 假设要使用AIDL, 

    须要完毕2件事情: 1. 引入AIDL的相关类.; 2. 调用aidl产生的class.

    AIDL的创建方法:

    AIDL语法非常easy,能够用来声明一个带一个或多个方法的接口,也能够传递參数和返回值。 由于远程调用的须要, 这些參数和返回值并非不论什么类型.

    以下是些AIDL支持的数据类型:

    1. 不须要import声明的简单Java编程语言类型(int,boolean等)

    2. String, CharSequence不须要特殊声明

    3. List, Map和Parcelables类型, 这些类型内所包括的数据成员也仅仅能是简单数据类型, String等其它比支持的类型.

    (另外: 我没尝试Parcelables, 在Eclipse+ADT下编译只是, 也许以后会有所支持



    13、dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念

          Dvm的进程是dalivk虚拟机进程,每一个android程序都运行在自己的进程里面,每一个android程序系统都会给他分配一个单独的liunx uid(user id),
    每一个dvm都是linux里面的一个进程.所以说这两个进程是一个进程.







  • 相关阅读:
    poj 1067||hdu 1527 取石子游戏(博弈论,Wythoff Game)
    CGAffineTransform属性
    自定义UITabBarController
    UISwitch用法:
    UIButton常见属性和方法
    xcode添加背景音乐/音效
    使用cocoaPods加载框架的具体步骤:
    UILabel
    NSString -- UILabel中字体有多种颜色,字符串自动计算高度/换行
    xcode 修改类名 变量名
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6767983.html
Copyright © 2011-2022 走看看