经典面试题汇总
1、
Android 本身的 api 并未声明会抛出异常,则其在运行时有无可能抛出runtime 异常,你遇到过吗?诺有的话会导致什么问题?如何解决?会,比如nullpointerException。我遇到过,比如textview.setText()时,textview没有 初始化。会导致程序无法正常运行出现forceclose。打开控制台查看logcat信息找出最新 Android面试题异常信息并修改程序。
Acitivity的进程,当处理Intent的时候,会产生一个对应的Service; Android的进程 处理器现在会尽可能的不kill掉你;非常容易使用
3、Android onLayout、layout区别MVC,MVP 和 MVVM如果后台的 Activity 由于某原因被系统回收了 , 如何在被系统回收之前保存当前状态?
重写onSaveInstanceState()方法,在此方法中保存需要保存的数据,该方法将会在 activity被回收之前调用。通过重写onRestoreInstanceState()方法可以从中提取保存好的数据
<activity>中配置:android :theme="@android:style/Theme.Dialog" 另外 android:theme="@android:style/Theme.Translucent" 是设置透明
对于单一 Activity 的应用来说,退出很简单,直接 finish()即可。当然,也可以用 killProcess()和 System.exit()这样的方法。
对于多个 activity而言:
1、记录打开的 Activity:每打开一个 Activity,就记录 下来。在需要退出时,关闭每一个 Activity 即可。
2、发送特定广播:在需要结 束应用时,发送一个特定的广播,每个 Activity 收到广播后,关闭即可。
3、递归退出:在打开新的 Activity 时使用 startActivityForResult,然后自己加标 志,在 onActivityResult 中处理,递归关闭。为了编程方便,最好定义一个 Activity 基类,处理这些共通问题。
在 2.1 之前,可以使用 ActivityManager 的 restartPackage 方法。 它可以直接结束整个应用。在使用时需要权限 android.permission.RESTART_PACKAGES。 注意不要被它的名字迷惑。
可是,在 2.2,这个方法失效了。在 2.2 添加了一个新的方法,killBackground Processes(), 需要权限 android.permission.KILL_BACKGROUND_PROCESSES。可惜的是,它和 2.2 的 restartPackage 一样,根本起不到应有的效果。
另外还有一个方法,就是系统自带的应用程序管理里,强制结束程序的方法, forceStopPackage()。它需要权限 android.permission.FORCE_STOP_PACKAGES。并且 需要添加 android:sharedUserId="android.uid.system"属性。
同样可惜的是,该方法是非公 开的,他只能运行在系统进程,第三方程序无法调用。 因为需要在 中添加 LOCAL_CERTIFICATE := platform。 而 是用于在 Android 源码下编译程序用的。
从以上可以看出,在 2.2,没有办法直接结束一个应用,而只能用自己的办法间接办到。现提供几个方法,供参考:
1、抛异常强制退出: 该方法通过抛异常,使程序 Force Close。 验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出 Force Close 的窗口。
2、记录打开的 Activity: 每打开一个 Activity,就记录下来。在需要退出时,关闭每一个 Activity 即可。
3、发送特定广播: 在需要结束应用时,发送一个特定的广播,每个 Activity 收到广播后,关闭即可。
4、递归退出 在打开新的 Activity 时使用 startActivityForResult,然后自己加标志,在 onActivityResult 中处理,递归关闭。 除了第一个,都是想办法把每一个 Activity都结束掉,间接达到目的。但是这样做同样不完 美。你会发现,如果自己的应用程序对每一个 Activity都设置了 nosensor,在两个 Activity 结束的间隙,sensor 可能有效了。但至少,我们的目的达到了,而且没有影响用户使用。
定义BaseActivity,在Activity的onCreate方法里向集合里添加,onDestory()里集合只能怪remove。在相对应的推出方法里遍历List集合调用finish方法。
为了编程方便,最好定义一个 Activity基类,处理这些共通问题。
6、AIDL 的全称是什么?如何工作?能处理哪些类型的数据?
全称是:AndroidInterface Define Language
在 Android 中, 每个应用程序都可以有自己的进程. 在写 UI 应用的时候, 经常要用到 Service. 在不同的进程中, 怎样传递对象呢?显然, Java中不允许跨进程内存共享.因此传递 对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的. 在 J2EE 中,采用 RMI 的方式, 可以通过序列化传递对象.在 Android 中, 则采用 AIDL 的方式.
理论上 AIDL 可以传递 Bundle,实际上做起来却比较麻烦。
AIDL(AndRoid 接口描述语言)是一种借口描述语言; 编译器可以通过 aidl 文件生成一段代 码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个 Activity中, 访 问另一个Service中的某个对象, 需要先将对象转化成AIDL可识别的参数(可能是多个参数), 然后使用 AIDL 来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象.
AIDL 的 IPC 的机制和 COM 或 CORBA 类似, 是基于接口的,
但它是轻量级的。它使用代 理类在客户端和实现层间传递值. 如果要使用 AIDL, 需要完成 2件事情:
引入 AIDL 的相 关类.;
2.调用 aidl 产生的 class.
AIDL 的创建方法:
AIDL 语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。
由于远程调用的需要, 这些参数和返回值并不是任何类型.下面是些 AIDL 支持的数据类型:
不需要 import 声明的简单 Java 编程语言类型(int,boolean 等)
String, CharSequence 不需要特殊声明
List, Map 和 Parcelables 类型, 这些类型内所包含的数据成员也只能是简单数据类型, String 等其他比支持的类型.
7、如请解释下 Android 程序运行时权限与文件系统权限的区别。
运行时权限 Dalvik(android 授权) 文件系统 linux 内核授权
8、系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由。
通过直接发送 Uri 把参数带过去,或者通过 manifest 里的 intentfilter 里的 data 属性
9、android 系统的优势和不足
Android 平台手机 5 大优势:
一、开放性
在优势方面,Android 平台首先就是其开发性,开发的平台允许任何移动终端厂商加入到 Android 联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富, 一个崭新的平台也将很快走向成熟。开放性对于 Android 的发展而言,有利于积累人气,这 里的人气包括消费者和厂商,而对于消费者来讲,随大的受益正是丰富的软件资源。开放的 平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机。
二、挣脱运营商的束缚
在过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能 接入什么网络,几乎都受到运营商的控制。从去年 iPhone 上市 ,用户可以更加方便地连 接网络,运营商的制约减少。随着 EDGE、HSDPA 这些 2G 至 3G 移动网络的逐步过渡和 提升,手机随意接入网络已不是运营商口中的笑谈,当你可以通过手机 IM 软件方便地进行 即时聊天时,再回想不久前天价的彩信和图铃下载业务,是不是像噩梦一样?互联网巨头 Google 推动的 Android 终端天生就有网络特色,将让用户离互联网更近。
三、丰富的硬件选择
这一点还是与 Android 平台的开放性相关,由于 Android 的开放性,众多的厂商会推出千奇 百怪,功能特色各具的多种产品。功能上的差异和特色,却不会影响到数据同步、甚至软件 的兼容,好比你从诺基亚 Symbian 风格手机 一下改用苹果 iPhone ,同时还可将 Symbian 中优秀的软件带到 iPhone 上使用、联系人等资料更是可以方便地转移,是不是非常方便呢?
四、不受任何限制的开发商
Android 平台提供给第三方开发商一个十分宽泛、自由的环境,不会受到各种条条框框的阻 扰,可想而知,会有多少新颖别致的软件会诞生。但也有其两面性,血腥、暴力、情色方面 的程序和游戏如可控制正是留给 Android 难题之一。
五、无缝结合的 Google 应用
如今叱诧互联网的 Google 已经走过 14 年度历史,从搜索巨人到全面的互联网渗透,Google 服务如地图、邮件、搜索等已经成为连接用户和互联网的重要纽带,而 Android 平台手机将 无缝结合这些优秀的 Google 服务。
再说 Android 的 5 大不足:
一、安全和隐私
由于手机 与互联网的紧密联系,个人隐私很难得到保守。除了上网过程中经意或不经意留 下的个人足迹,Google 这个巨人也时时站在你的身后,洞穿一切,因此,互联网的深入将 会带来新一轮的隐私危机。
二、首先开卖 Android 手机的不是最大运营商
众所周知,T-Mobile 在 23 日,于美国纽约发布 了 Android 首款手机 G1。但是在北美市场, 最大的两家运营商乃 AT&T 和 Verizon,而目前所知取得 Android 手机销售权的仅有 T-Mobile 和 Sprint,其中 T-Mobile 的 3G 网络相对于其他三家也要逊色不少,因此,用户 可以买账购买 G1,能否体验到最佳的 3G 网络服务则要另当别论了!
三、运营商仍然能够影响到 Android 手机
在国内市场,不少用户对购得移动定制机不满,感觉所购的手机被人涂画了广告一般。这样 的情况在国外市场同样出现。Android 手机的另一发售运营商 Sprint 就将在其机型中内置其 手机商店程序。
四、同类机型用户减少
在不少手机论坛都会有针对某一型号的子论坛,对一款手机的使用心得交流,并分享软件资 源。而对于 Android 平台手机,由于厂商丰富,产品类型多样,这样使用同一款机型的用户 越来越少,缺少统一机型的程序强化。举个稍显不当的例子,现在山寨机泛滥,品种各异, 就很少有专门针对某个型号山寨机的讨论和群组,除了哪些功能异常抢眼、颇受追捧的机型 以外。
五、过分依赖开发商缺少标准配置
在使用 PC 端的 Windows Xp 系统的时候,都会内置微软 Windows Media Player 这样一个 浏览器程序,用户可以选择更多样的播放器,如 Realplay 或暴风影音等。但入手开始使用 默认的程序同样可以应付多样的需要。在 Android 平台中,由于其开放性,软件更多依赖第 三方厂商,比如 Android 系统的 SDK 中就没有内置音乐 播放器,全部依赖第三方开发,缺 少了产品的统一性。
10、Android dvm 的进程和 Linux 的进程 , 应用程序的进程是否为同一个概念
DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥 有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认 为是同一个概念。
11、sim 卡的 EF 文件是什么 ? 有何作用
sim卡的文件系统有自己规范,主要是为了和手机通讯,sim本 身可以有自己的操 作系统,EF就是作存储并和手机通讯用的
12、嵌入式操作系统内存管理有哪几种, 各有何特性
页式,段式,段页,用到了MMU,虚拟空间等技术
13、什么是嵌入式实时操作系统 , Android 操作系统属于实时操作系统吗?
嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的 速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系 统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。主要用 于工业控制、军事设备、 航空航天等领域对系统的响应时间有苛刻的要求,这 就需要使用实时系统。又可分为软实时和硬实时两种,而 android 是基于 linux 内核的,因此属于软实时。
14、一条最长的短信息约占多少 byte?
中文70(包括标点),英文160,160个字节。
15、有一个一维整型数组 int[]data 保存的是一张宽为 width , 高为 heig ht 的图
片像素值信息。请写一个算法,将该图片所有的白色不) ) 像素点透明 (0xffffffff 的透明度调整为 50%。
16、如何将 SQLite 数据库 (dictionary.db 文件) ) 与 apk 文件一起发布
可以将dictionary.db文件复制到Eclipse Android工程中的res aw目录中。所有在res aw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。可以将dictionary.db文件 复制到res aw目录中
17.、如何将打开 res aw 目录中的数据库文件?
在 Android 中不能直接打开 res aw 目录中的数据库文件,而需要在程序第一次启动时 将该文件复制到手机内存或 SD 卡的某个目录中,然后再打开该数据库文件。 复制的基本方法是使用 getResources().openRawResource 方法获得 res aw 目录中资源的 InputStream 对象,然后将该 InputStream 对象中的数据写入其他的目录中相应文件中。在 Android SDK 中可以使用 SQLiteDatabase.openOrCreateDatabase 方法来打开任意目录中 的 SQLite 数据库文件。
18、DD MS 和 TraceView 的区别? ?
DDMS是一个程序执行查看器,在里面可以看见线程和堆栈等信息,TraceView是 程序性能分析器
19、java 中如何引用本地语言
可以用JNI(java native interface java 本地接口)接口
20.、谈谈 Android 的 IPC (进程间通信)机制
IPC 是内部进程通信的简称,是共享"命名管道"的资源。Android 中的 IPC 机制是为了 让 Activity 和 Service 之间可以随时的进行交互,故在 Android 中该机制,只适用于 Activity 和 Service 之间的通信,类似于远程方法调用,类似于 C/S 模式的访问。通过定义 AIDL 接 口文件来定义 IPC 接口。Servier 端实现 IPC 接口,Client 端调用 IPC 接口本地代理。
21、 NDK 是什么
NDK是一系列工具的集合。
它提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。
这些工具对开发者的帮助是巨大的。它集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。它可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。
22、Android View刷新机制
在Android的布局体系中,父View负责刷新、布局显示子View;而当子View需要刷新时,则是通知父View来完成。这种处理逻辑在View的代码中明确的表现出来。
子View调用invalidate时,首先找到自己父View(View的成员变量mParent记录自己的父View),然后将AttachInfo中保存的信息告诉父View刷新自己。 View的父子关系的建立分为两种情况:
View加入ViewGroup中 用到的方法是 addViewInner
DecorView注册给WindowManagerImpl时,产生一个ViewRoot作为其父View。
AttachInfo是在View第一次attach到Window时,ViewRoot传给自己的子View的。这个AttachInfo之后,会顺着布局体系一直传递到最底层的View。 并且在新的View被加入ViewGroup时,也会将该AttachInfo传给加入的View ViewGroup.java
在invalidate中,调用父View的invalidateChild,这是一个从第向上回溯的过程,每一层的父View都将自己的显示区域与传入的刷新Rect做交集。
Invalidate()方法不能放在线程中,所以需要把Invalidate()方法放在Handler中。在MyThread中只需要在规定时间内发送一个Message给handler,当Handler接收到消息就调用Invalidate()方法。
postInvalidate()方法就可以放在线程中做处理,就不需要Handler。
而上面的新线程Thread可以放在OnCreate()中开始,也可以放在OnStart()中开始 。 Invalidate()方法和postInvalidate()都可以在主线程中调用而刷新视图 。
当Invalidate()被调用的时候,View的OnDraw()就会被调用,Invalidate()必须是在UI线程中被调用,如果在新线程中更新视图的就调用postInvalidate()。
这也说明了Invalidate()方法和postInvalidate()之间的区别。
22、Android onLayout、layout区别
onLayout方法是ViewGroup中子View的布局方法,用于放置子View的位置。放置子View很简单,只需在重写onLayout方法,然后获取子View的实例,调用子View的layout方法实现布局。在实际开发中,一般要配合onMeasure测量方法一起使用。
该方法在ViewGroup中定义是抽象函数,继承该类必须实现onLayout方法,而ViewGroup的onMeasure并非必须重写的。View的放置都是根据一个矩形空间放置的,onLayout传下来的l,t,r,b分别是放置父控件的矩形可用空间(除去margin和padding的空间)的左上角的left、top以及右下角right、bottom值。
layout方法:
该方法是View的放置方法,在View类实现。调用该方法需要传入放置View的矩形空间左上角left、top值和右下角right、bottom值。这四个值是相对于父控件而言的。例如传入的是(10, 10, 100, 100),则该View在距离父控件的左上角位置(10, 10)处显示,显示的大小是宽高是90(参数r,b是相对左上角的),这有点像绝对布局。
平常开发所用到RelativeLayout、LinearLayout、FrameLayout...这些都是继承ViewGroup的布局。这些布局的实现都是通过都实现ViewGroup的onLayout方法,只是实现方法不一样而已。
在自定义View中,onLayout配合onMeasure方法一起使用,可以实现自定义View的复杂布局。自定义View首先调用onMeasure进行测量,然后调用onLayout方法,动态获取子View和子View的测量大小,然后进行layout布局。
23、MVC,MVP 和 MVVM的区别
MVC 通信方式,环形方式:
1、View 传送指令到 Controller
2、Controller 起到不同层面间的组织作用,用于控制应用程序的流程。它处理事件并作出响应。“事件”包括用户的行为和数据 Model 上的改变。
3、Model 将新的数据发送到 View,用户得到反馈 所有通信都是单向的。
MVP 通信方式:
1、各部分之间的通信,都是双向的。
2、View 与 Model 不发生联系,都通过 Presenter 传递。
3、View 非常薄,不部署任何业务逻辑,称为”被动视图”(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。
MVVM 模式是 MVP 的升级: 基本上与 MVP 模式完全一致。唯一的区别是,它采用双向绑定:View的变动,自动反映在 ViewModel,反之亦然。
我们针对业务模型,建立的数据结构和相关的类,就可以理解为AndroidApp 的 Model,Model 是与 View 无关,而与业务相关的,例如数据库读取数据,应该是属于model层的事情。
我的猜想:
至于为什么我们通常直接去在 Activity 中去写数据库数据读取,我的猜想是因为简单。试想,如果是为了规范,首先定义一个getDataFromDB()的接口,再写个类实现getDataFromDB()方法,以后如果改了请求数据所用的方法,直接改写实现类,听起来确实不错,可是仅仅是为了从数据库读点数据,额外添加了至少两个类文件真的有意义吗。 当然网络请求,是属于业务逻辑层C层。
MVP中 Presenter 真正需要处理的并非业务逻辑,而应该是视图逻辑。业务逻辑应该是视图无关的,可以是单独的一个类中,也可以是在P中。
P与V是一对多关系
EventBus应该作用于P层,在P层发送,在P层接收。 MVVM中,M层改变并不是直接改变V层,而是通过VM层去改变V层。M与V依旧是不直接操作的。
相关介绍:
Android 高级面试题及答案
40个比较重要的Android面试题
面试后的总结
如果你觉得此文对您有所帮助,欢迎入群 QQ交流群 :232203809 微信公众号:终端研发部
Hello,伙伴们
长按二维码就可以关注我们啦!