android面试总结(精选9篇)
不全但是有一定的代表性
去的几家公司都是外包,项目紧急不会去看你项目上的那些小应用,能干活就行。
外包IBM:考得很基础,但是没真正的经验平时不会去记
1>dip设备独立像素
这个和设备硬件有关,一般为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素
480*320(160dpi):10*10dip = 10*10px 840*480(240dpi): 10*10dip = 15*15px Pixs = dips *(density / 160)2> WVGA、HVGA和QVGA 屏幕标准
3>屏幕适配.(实际项目中不会提供三套drawable图片资源)Android对于屏幕适配的解决方案分析 图片适配:9.png 其他适配: 1.Android将UI设计部分和代码逻辑部分分离开来,独立成一个XML文件,方便开发人员修改。
2.使用的长度单位是密度而不是像素。像素是自适应的大敌,固定了绝对坐标的像素值,就别想再好好安心地让它自个儿适应屏幕了。Android推荐使用dp作为长度单位。dp会根据手机的分辨率而自动调整大小。3.布局器功能强大。Android的布局器分为五种:LinearLayout,提供水平/垂直平铺的布局器;TableLayout,提供行和 列的的布局;FrameLayout,帧布局器,提供分层的布局;AbsoluteLayout,使用绝对坐标来定义控件的位 置;RelativeLayout,布局器中的控件用相对位置来布局。布局器的大小有自适应内容和与父控件相同两种。这些布局器完全可以承担起程序中基本 的布局要求。
4.Android中有一个密度的概念,表示每英寸有多少个显示点。当没有与手机分辨率相匹配的屏幕适配方案时,会根据手机的屏幕密度选取一个最接近的屏幕密度的适配方案,这样会让图片的失真达到最低。
5> Include使用与传参 组件复用
6>横屏竖屏切换处理
主要是切换时生命周期方法(结合你在项目中的应用)
7>应用程序放在真机什么目录下 以及常见的目录有哪些 系统应用程序 system/app 自己安装的应用 data/app
8> 你们项目需求怎么做的,请描述下
奥信面试:(主要是他们公司项目中的东西,演示功能问怎么实现)ImageView点击后更改背景色
Xml:selector + item
下载后回到刚刚的页面更新页面ListView对应Item的图标
1.startActivityForResult
2.下载完成发送广播
从网络上下载大图片
(可以作为项目难点陈述)ListView异步加载图片 +缓存()
Handler + 线程池 + 开启内存缓存(SoftReference)
Handler + 线程池 + 保存文件到SD卡上
书架的实现
平时多线程用到哪些(区分两种方法的特点)Handler
AsyncTask
Canvas画图用法
自定义控件使用(很经常问到)
Android应用程序生命周期(区分与Android组件的生命周期)被请求时实例化,系统内存不足被清理
Activity的启动模式
Standard singleTop singleTask singleInstance 网络7层模型 Tcp/ip(分别位于那一层)
应用层 表示层 会话层 传输层
网络层 数据链路层 物理层
常用设计模式(非重点 能答更好)简单工厂,抽象工厂方法,代理模式,…
华讯财经: 主要是简历上写的项目
由于项目都从头到尾敲的没啥好讲的属于闲聊吹牛的公司。
支付宝面试过程(电面主要问j2ee):
Activity中onCreate(),onStart()方法都会执行为什么不合并为一个方法
Activity的onCreate()中启动Service,那么onCreate()中的代码与Service中onStart()方法中的代码所在线程关系
耗时操作问题(主要考虑线程关系)
项目中的难点
完成!!
Android中MVC设计模式的理解
UI布局相关
}
52. Linux中跨进程通信的几种方式 。
linux编程
# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
# 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
# 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
# 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
# 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
53. 谈谈对Android NDK的理解。
native develop kit 只是一个交叉编译的工具 .so
1.什么时候用ndk, 实时性要求高,游戏,图形渲染,
opencv (人脸识别) , ffmpeg , rmvb mp5 avi 高清解码. ffmpeg, opencore.
2.为什么用ndk,ndk的优点 ,缺点 ,
我们项目中那些地方用到了ndk,
54. 谈谈Android的优点和不足之处。
1、开放性,开源 ophone 阿里云( 完全兼容android)
2、挣脱运营商束缚
3、丰富的硬件选择 mtk android
4、不受任何限制的开发商
5、无缝结合的Google应用
缺点也有5处:
1、安全问题、隐私问题
2、卖手机的不是最大运营商
3、运营商对Android手机仍然有影响
4、山寨化严重
5、过分依赖开发商,缺乏标准配置 版本过多
55. Android系统中GC什么情况下会出现内存泄露呢? 视频编解码/内存泄露
检测内存泄露 工具
导致内存泄漏主要的原因是,先前申请了内存空间而忘记了释放。如果程序中存在对无用对象的引用,那么这些对象就会驻留内存,消耗内存,因为无法让垃圾回收器GC验证这些对象是否不再需要。如果存在对象的引用,这个对象就被定义为“有效的活动”,同时不会被释放。要确定对象所占内存将被回收,我们就要务必确认该对象不再会被使用。典型的做法就是把对象数据成员设为null或者从集合中移除该对象。但当局部变量不需要时,不需明显的设为null,因为一个方法执行完毕时,这些引用会自动被清理。
Java带垃圾回收的机制,为什么还会内存泄露呢?
Vector v = new Vector(10);
for (int i = 1; i < 100; i++) {
Object o = new Object();
v.add(o);
o = null;
}//此时,所有的Object对象都没有被释放,因为变量v引用这些对象。
Java 内存泄露的根本原因就是 保存了不可能再被访问的变量类型的引用
56. Android UI中的View如何刷新。
在主线程中 拿到view调用Invalide()方法,查看画画板里面更新imageview的方法
在子线程里面可以通过postInvalide()方法;
57. 简单描述下Android 数字签名。
Android 数字签名
在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系
Android系统要求每一个安装进系统的应用程序都是经过数字证书签名的,数字证书的私钥则保存在程序开发者的手中。Android将数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,不是用来决定最终用户可以安装哪些应用程序。
这个数字证书并不需要权威的数字证书签名机构认证(CA),它只是用来让应用程序包自我认证的。
同一个开发者的多个程序尽可能使用同一个数字证书,这可以带来以下好处。
(1)有利于程序升级,当新版程序和旧版程序的数字证书相同时,Android系统才会认为这两个程序是同一个程序的不同版本。如果新版程序和旧版程序的数字证书不相同,则Android系统认为他们是不同的程序,并产生冲突,会要求新程序更改包名。
(2)有利于程序的模块化设计和开发。Android系统允许拥有同一个数字签名的程序运行在一个进程中,Android程序会将他们视为同一个程序。所以开发者可以将自己的程序分模块开发,而用户只需要在需要的时候下载适当的模块。
在签名时,需要考虑数字证书的有效期:
(1)数字证书的有效期要包含程序的预计生命周期,一旦数字证书失效,持有改数字证书的程序将不能正常升级。
(2)如果多个程序使用同一个数字证书,则该数字证书的有效期要包含所有程序的预计生命周期。
(3)Android Market强制要求所有应用程序数字证书的有效期要持续到2033年10月22日以后。
Android数字证书包含以下几个要点:
(1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
(2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
姓 名:
国籍: 中国
目前所在地: 番禺区
民族: 汉族
户口所在地: 湖南
身材: 168 cm 58 kg
婚姻状况: 未婚
年龄: 34 岁
培训认证:
诚信徽章:
求职意向及工作经历
人才类型: 普通求职
应聘职位: 计算机软件:ERP/SAP系统工程师、软件工程师:Windows Mobile,Android,J2ME开发、嵌入式软件开发(Linux/单片机/DLC/DSP…):
工作年限: 8
职称: 无职称
求职类型: 全职
可到职日期: 一个星期
月薪要求: 5000--8000
希望工作地区: 广东省 北京 上海
个人工作经历:
公司名称:
起止年月:20xx-03 ~ 20xx-04广州市科思电脑系统公司
公司性质: 所属行业:
担任职务: 项目经理、软件工程师
工作描述: 负责企业ERP/SAP,MRP2,HR管理系统的开发与实施工作,多次带领开发团队深入企业,参与多家企业的ERP/SAP系统的设计与项目实施,成功完成了电子、服装等十多个行业公司企业的ERP/SAP系统的开发与实施任务。
离职原因:
公司名称: 起止年月:20xx-02 ~ 20xx-01广州市天河学院
公司性质: 所属行业:
担任职务: 计算机系教师
工作描述: 负责软件,网络计算机相关课程讲授,带领学生进行进行课程实验。
离职原因:
公司名称: 起止年月:20xx-01 ~ 20xx-01广州艾斯顿有限公司
公司性质: 所属行业:
担任职务: 电脑部主管,软件工程师
工作描述: 负责公司的电脑维护,网站维护,软件开发工作。
离职原因:
教育背景
毕业院校: 湖南常德电脑大学
最高学历: 本科
毕业日期: -07-01
所学专业一: 计算机信息管理
所学专业二:
受教育培训经历:
起始年月 终止年月 学校(机构) 专 业 获得证书 证书编号
1992-09 -07 湖南常德机电工程学校(湖南常德职业技术学院) 机械电子 毕业证
1996-09 1999-07 湖南常德电脑大学 计算机信息管理 毕业证
20xx-01 20xx-01 广东外语外贸大学 商务英语 结业证
语言能力
外语: 英语 良好
国语水平: 优秀 粤语水平: 良好
工作能力及其他专长
1.精通Windows Mobile,WinCe手机系统软件开发,熟悉Android,J2Me系统设计。
2.精通C/C++VB/VC++,C++Builder/ABAP, EVC/WIN CE, SQL SERVER等编程语言, 有丰富的ERP/MRP/OA系统开发与实施经验,精通酒店信息管理系统的开发与维护,为多家企业成功设计开发了ERP/SAP系统软件和一百多家五星级酒店管理系统,赢得了客户广泛的好评。
2.熟识思科、华为等网络设备的安装与调试维护工作,精通RFID、嵌入式系统程序设计、嵌入式/上位机编程。
详细个人自传
精通Windows Mobile,WinCe手机系统软件开发,熟悉Android,J2Me系统设计,精通C/C++VB/VC++,C++Builder/SAP(ABAP), EVC/WIN CE,RFID、SQL SERVER等编程语言, 熟悉思科、华为等网络设备的安装与调试维护工作,为多家企业成功设计开发、完成实施ERP/SAP系统软件和一百多家五星级酒店管理系统,赢得了客户广泛的好评。
widget相对位置的完成在antivity的哪个生命周期阶段实现。
请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。
AIDL的全称是什么?如何工作?能处理哪些类型的数据?
请解释下Android程序运行时权限与文件系统权限的区别。
系统上安装了多种浏览器,能否指定某浏览器访问指定页面?
对多线程的运用和理解,及多线程之间handle的传值。
对android虚拟机的理解,包括内存管理机制垃圾回收机制。
Framework工作方式及原理,Activity是如何生成一个view的,机制是什么。
android本身的一些限制,比如apk包大小限制,读取大文件时的时间限。
如何加载的音乐信息,如何改善其效率。
ListView如何提高其效率?
启动应用后,改变系统语言,应用的语言会改变么?
启动一个程序,可以主界面点击图标进入,也可以从一个程序中跳转过去,二者有什么区别?
Android程序与Java程序的区别?
Android中Task任务栈的分配。
在Android中,怎么节省内存的使用,怎么主动回收内存?
不同工程中的方法是否可以相互调用?
在Android中是如何实现判断区分通话记录中的电话状态,去电,来电、未接来电?
dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念
sim卡的EF 文件有何作用
如何判断是否有SD卡?
嵌入式操作系统内存管理有哪几种, 各有何特性。
什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?
一条最长的短信息约占多少byte?
Linux中跨进程通信的几种方式 。
谈谈对Android NDK的理解。
谈谈Android的优点和不足之处。
Android系统中GC什么情况下会出现内存泄露呢?
Android UI中的View如何刷新。
简单描述下Android 数字签名。
什么是ANR 如何避免它?
android中的动画有哪几类,它们的特点和区别是什么?
handler机制的原理。
android中线程与线程,进程与进程之间如何通信。
说说mvc模式的原理,它在android中的运用。
android中有哪几种解析xml的类,官方推荐哪种?以及它们的原理和区别。
DDMS与TraceView的区别?
res目录有默认几项resource。
android的哪个版本是一次重大的升级?
两个Activity之间跳转时必然会执行的是哪几个方法。
横竖屏切换时候Activity的生命周期。
如何将一个Activity设置成窗口的样式。
你后台的Activity被系统 回收怎么办?
如何退出Activity?如何安全退出已调用多个Activity的Application?
如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
两个Activity之间怎么传递数据?
怎么让在启动一个Activity是就启动一个service?
同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?
Activity怎么和service绑定,怎么在activity中启动自己对应的service?
什么是Service以及描述下它的生命周期。
Service有哪些启动方法,有什么区别,怎样停用Service?
不用service,B页面为音乐播放,从A跳转到B,再返回,如何使音乐继续播放?
什么是IntentService?有何优点?
什么时候使用Service?
请描述一下Intent 和 Intent Filter。
Intent传递数据时,可以传递哪些类型数据?
说说Activity,Intent,Service是什么关系 。
请描述一下Broadcast Receiver。
在manifest和代码中如何注册和使 用 broadcast receiver 。
请介绍下ContentProvider是如何实现数据共享的。
请介绍下Android的数据存储方式。
SharedPreferences:用来存储”key-value paires“格式的数据,它是一个轻量级的键值存储机制,只可以存储基本数据类型。
文件存储:通过FileInputStream和FileOutputStream对文件进行操作。在Android中,文件是一个应用程序私有的,一个应用无法读写其他应用程序的文件。
AF知识网用户的回答我跟腾讯有三次之缘,但是最终还是没去成。
第一次是我大三的时候,已经忘了是怎么去的,当时我几乎什么都不会,笔试没过;
第二次我大四即将毕业,在某国内外包大公司实习一年,倒也没做什么特别重量级的活儿,也就是对安卓整套环境有了些许的了解,当时人才招聘会上就进行第一面,那个考官问了我几个有关安卓非常简单的问题以后,问了我这个问题: 你对多核编程优化怎么看?
我当时就傻眼了,一点也没接触过,确实不懂。很尴尬地打了个哈哈就过去了,结果面试OK,后来进腾讯和一群“高等学府”的计系、数学系做笔试,卡在了笔试上,也没去成。我当时基础知识很垃圾,基本属于什么鸟都不会。
第三次(两年以后)我接到一个深圳的电话,问我有没有兴趣去深圳,我以为是骗子,百度了一下发现真的是腾讯,聊了几句,他们手机QQ和开放平台的项目组在招人,这样看来比我前两次面试的小地方“腾讯子公司”强多了。
然后您猜怎么着,我前一周刚交了房子的首付,这时候让我离开去深圳,实在是很艰难。然后又没去成。
我在刚毕业的时候碰了几次壁,就老老实实地找了个小公司,要求不是特别高的,开始边玩边学。小公司是对日外包,顺道学了学日语。做了几个项目以后,这个小公司没有顶住这两年的中日压力,遣散了。我又加入了我朋友的公司一起忙项目,他的口才非常牛逼,我们俩的配合一般是他弄来项目,我来负责安卓部分的开发和整体项目(包括ios端)的把控。后来我因为房子的原因,没有和我的朋友继续下去,去了一个客户那里,这个人做所谓的O2O项目,并给我这个刚毕业不久的人看似不错的待遇并约定了股份(至少我的理解是这样)。随后一段时间到今年年初,承诺的股份、期权哪怕预购一毛钱没有(事实上我感觉项目要黄掉了),加之公司管理混乱不堪,也就退出了,现在在一家不大不小的公司里面拿着不高不低(在小城市)的工资。
你看我经历了哪些事情:
· 跟你一样地被羞辱(请允许我用这个词,我觉得是)· 频繁换工作(跳槽)· 互联网创业
· 背叛朋友(其实也没那么极端,我们现在关系很好,但是我一直觉得对不起他们)· 基本了解了公司的各种流程(小公司什么事儿都得接触)
· 学会了忍耐(呵呵脑残的客户and最近很火的《项目经理是条狗B》)· 参加了2013年的Google I/O Extended(北京)· 玩了O2O,做了各种各样的小项目
还有很多收获,我就不说了。
我至今仍一直在做最底到Framework层的东西,都是些小的app,虽然自己最近也有打算往NDK转,同时也在偶尔看看py和oc,但仍然技术走得慢吞吞:P 你问我为什么不往下学,我搞了这么几年开发,偶尔会有这样的想法: 我可能真的不适合搞技术。
脑子没有那些怪物聪明,耐不下性子没法挑战连续20小时不动,离开大学几年后想想数学都头疼,喜欢经常扒着淫科技看三级风,又或者跟是个人开始聊UE,UX,刷AF知识网等等。
然后我再逼着自己去学数据结构,学C语言,学py,学Axure,学各种专业知识。哦对了还得考个研究生来刷学历。
最近两年我像是突然开了窍,知道了各种各样的新东西,慢慢地我不光能在android开发,对做web的有时候还能指手画脚,有时候喷一喷做UI的小姑娘;下午开会的时候我当着全组人的面指责了我的项目经理-我们原来有个给A公司做的项目,然后他要给B公司出一套同样的东西,把UI给换掉,他不理解我说的XX不好实现是为什么,他的意思:
我觉得这个XXXX你可以这么实现,而且这不就是换套皮肤么,没事儿的,很简单。我说你这个东西设计成这样本身就不合理,你给看的交互图是根据ios来设计的,你要硬套在安卓上,加上有屋里返回按键就会有很多逻辑上的跳转问题,然后我解释了一大通。他问我安卓设计是什么样的,并问与会的人谁用安卓手机来讲一讲。
我就挤出是个人都能看出特别假的笑容跟他说:别问了,我给你出几个方案,你来选吧。
------------分割线------------谢谢题主看了我上面说的废话。
你还会想到“android开源项目”甚至“android本身”么? 我应该算是从htc那个翘屁股G3开始,一直到前一阵子才换的Nexus5,大大小小经历了20、30台手机,什么品牌的都有,着实算是“玩了个遍”。我大三的时候不挣钱,又想换手机,拿着自己的大学学费去买手机,玩十几二十天再卖掉,甚至倒卖了一阵子手机---后来学费拖到快毕业才交。在我开始真正接触android开发的时候,我的老师告诉我移动MM平台在各大高校里面有比赛,开发Android程序的,说咱们学校几乎可以内定,我花了二十多天的不眠之夜搞了个app,结果不了了知了。我不甘心自己做的东西就这么结束,又开始研究在各大市场上线,自己去做推广,各大轮胎发帖;直到后来某个小的广告平台推广员(为了避嫌我就不说名字了)联系我,说让我用他们的广告,我又开始研究什么是CPM,CPC;广告出来了效益不好,很捉急,我就又直到了app annie,友盟这种东西;自己玩够了,去公司,我们那个小公司,我又了解了我的五险一金的实际作用,年审是什么东西;项目可能不大,但是有些理论知识又像什么PMP的,又开始学习。
我一直没机会,其实主要还是自己脑子笨,没空学习基础知识,没学C/C++。
------------分割线------------我不知道说到这里,你有没有点明白我的意思了? 说句很显而易见的话:【android开源项目】在你的实际工作中,只是很小很小很小的一部分。它是建立在很多基础知识之上,就像人类穷尽一生甚至永生去研究数学,物理学,而工业发展只是近二百年的事情。你学习计算机,写代码,应该学习的是数学思想,逻辑思想和抽象方法。
有点吹牛逼的意思哈哈,扯远了。
然后我们再回来说说你的实际面试情况:
1.面试官素质确实有参差不齐的情况,如果你面试的次数多就会知道,这点你不必太介意。面试官就算技术本领再高超,多数也都是“屌丝程序员(„„)”,都会有个人喜好。我不忌讳地说,如果有个美女过来被我面试,她什么都不会,我也愿意要进来教她,因为她站着就好了啊;相反如果一个技术非常高超的牛逼哄哄地人,我直接说长得丑吧(对不起题主我没有别的意思„),可能我的第一印象就不会好,如果我当天心情不好,那么我很有可能也会故意刁难你。
所以这点可能只能怪你运气不好。
2.面试的技巧性确实非常大,有些网文《你所不知道的面试21个技巧》《如何抓住面试官的心》这种是可以参考的。一般来说,出于最最基本的礼貌,那个面试官再刁难你也不会一个劲地喷你吧?他在问你你不会的问题的时候,你可以尝试用另一种方式将他引导开,或者是避开这个问题。比如他问你C语言的预编译,你就跟他扯java语言由于特性xxx编译型语言和解释型语言xxx可以换种方式实现xxx我以前的一个项目„„你从你的语言里面放出大量的“可以”让面试官提问的问题,并且确定这是你熟悉或者了解的(一定!),这样他就会按照你的思路走了。
3.底子一定要硬,一定要诚实。我面试过不少从xx培训学校出来的学生,那个简历上写的各种语言、各种架构、各种工具熟练掌握把我都快要吓尿了,然后工资要2000块。这种就是非常让面试官反感的做法,特别是程序员多多少少地都有些傲气,你可以稍微夸大一点点,但绝对不能胡说八道。自己的必须是有点料的,你不能纯凭一张嘴去应聘纯技术岗,即便进去了,怕也是呆不长。
不过,如果第二条中,有些比较一根筋(蠢)的面试官非得“我不想听你说这些,你就告诉我C语言的预编译原理就可以了。” 呵呵自求多福吧少年。
面试的过程不要把自己看的太低,刚毕业的时候谦逊点可以,如果工作很多年了,还因为一个普通面试而感到郁闷,就有点经验不足了。面试本身就是个双选的过程,你觉得我技术不合格,我的思想太胡扯,你可以不要我;同样,我觉得你这个项目经理足够蠢,HR足够装逼,我也可以拍拍屁股走人。本身就是很平等的关系,而且我接触的人至少有一半,如果你不放高姿态,他们就会觉得你不够专业。
其次是有关你认为的QQ各种软件对Android端的“不重视”,我给说一句话吧: 在其位,谋其职,尽其责。又或者:
是粑粑总有被拉出来的时候,别整天像个屁一样空想。
原谅我的粗俗,如果你真的出于对qq邮箱android版的喜爱,你自己做一套你心目中遵循“Android设计规范”的demo,再拿去腾讯面试,并给面试官详细讲解。面试官还会问你这些你看起来不着边的问题么?
你让我跟你谈开源项目,我随便找一个你能告诉我它的实现原理么? 你让我跟你谈安卓设计,我说一条pattern你能告诉我具体内容么? 你又让我跟你谈二叉树,二叉树和散列表在亿级数据查找的优缺点你确定你能说得滴水不漏么?
其三,不要对大公司有盲目崇拜。
我不知道你用没用过微信的api,反正我用微信的几个开放api,相比起支付宝的和百度的: 简直就是烂的一比!!不多说了全是泪。
最后,你的认识上有了偏差。我刚毕业的时候还去过另一个某国内大型外包公司面试,那个人根本不想给我好好面试。迟到、办公室破旧、而且对我出言不逊。当时作为一个刚毕业的大学生,也就因为我是个男人才没哭出来。至今我对那家公司非常厌恶。这样是不好滴!
答主你看看,只是你去的时候,由于某个或者某些原因,那个人故意刁难你也好,自己水平不好也罢,当天的面试没有通过而已,跟什么“为什么有公司或者架构师会用ios的思维来找android程序员,并根据ios开发android程序呢”一毛钱关系都没有!你又不是“有公司”或者“架构师”,你怎么知道他们是这么想的?
作为一个程序员,别总用主观臆想才揣测现实世界,那是女人和韩寒做的事情。
我建议答主,多运动运动,学学别的知识,把自己的知识面无限地拓宽,然后抓一门知识深入研究,到下次面试时候:“其他的我可能没做过不太了解,但是有关这方面的东西,你随便问”。
如果一两年以后再接到腾讯HR的电话,可以告诉我一声:)desmo的回答楼主挺扯的,android开源项目ActionBarSherlock/SlidingMenu/Android-ViewPagerIndicator/Android-PullToRefresh,这玩意谁不会用?其他不多说SamuraiSong的回答题主应聘的职位应该是T3级别以上的
腾讯对于T3要求蛮严格的,除了本身专业方向要足够强之外,其他一些专业性知识也要过硬才可以
就像数据结构,编译原理,包括C/C++
找个ios来面试你说明人家至少T3.2以上了,又不是来面试你android的,是来面试你“其他”专业知
识的,至于为什么android的没来,我估计是因为他们觉得你“其他”的不行,T3肯定没戏,又没有
T2的名额,索性就不浪费大家的时间了
我曾经去面过一次OMG,从内部得到的消息是T3以上 IOS必须会android ,Android必须熟练C/C++
当也是没有T2职位,就不了了之了辜水鑫2010的回答我大三在腾讯实习,做ios开发的。我选择的是android开发,之前只学过android开发,没有ios经验,最后还是去了做ios。
面试官是我的leader,组长,面试主要是c
c++ 操作系统 数据结构和算法。
我身边很多同事,也反映没有问ios开发的问题,还有同事之前是做赛班的。个人觉得,基础比ios技能重要,基础好,学习ios就一个月半个月的事。最怕的是,基础不好,不懂指针内存性能优化,即使会ios开发,写出来的代码也可能有问题。而且我2013年实习时,那个项目很多类没有用arc,要自己管理内存,这个就是看你以前基础了。
作为程序员,基础很重要,技能也很重要。两个平衡发展,才能在事业上更上一层楼。谢谢!马天翼的回答我来说说我的看法。
题主所说的那些安卓开源组件,不过是使用上去看看doc的问题,而且大公司手写也就分分钟的事情,如果面试官问我这些怎么用,我才觉得不好呢。其实题主说反了,这些组件才是偶尔一个项目拿来用一下罢了,而且只是在项目的初期用一次罢了。比如QQ之前没有SlidingMenu,现在5.0才有,也就是自己做一下,会这些很熟练有什么用?你加入微信组了,根本连写这个的机会都没有。
我个人觉得有没有在github上去提交过这些开源组件的bug,参与改进才是一个考核标准吧。什么ActionBarSherlock,现在Google官方也不推荐使用了,你看,用的再熟悉,现在也没用了吧。
然后这些二叉树、性能的问题,才是一个程序员的内功,这些问题都搞懂了,说明挑战问题的能力就锻炼上来了。腾讯重视基础嘛,这是人家公司招人的特色,因为产品驱动的话,变化快,我觉得个人喜好问题,没有必要黑人家。我们公司在腾讯Linux后台开发的现在出来做首席安卓开发男神的就很厉害啊。
专业技能固然重要,但是也是可以突击的,更重要的解决问题的能力嘛。AF知识网用户的回答显然,面试官不会关注你会不会用 “Android本身,Android开源项目ActionBarSherlock/SlidingMenu/Android-ViewPagerIndicator/Android-PullToRefresh,也不会关注android设计的qq邮箱android客户端会有多NB”。
面试官关心的是你能不能写出像“ActionBarSherlock/SlidingMenu/Android-ViewPagerIndicator/Android-PullToRefresh”这样NB的东西。可写出这样NB的东西,连数据结构都不懂,又怎么能让面试官信服?
对于一个项目管理人员而言,会不会用只是时间问题,工作量问题,你一天不会,一星期应该可以了吧? 但能不能帮我提出方案,解决问题才是真正的能力问题。这就是兵和将的区别。well cheng的回答赞同 我现在就是如此 iOS开发 基本上项目就是Google的 那里不会找哪里 然后各种类随便用
但是 你让我自己撸一个出来 呵呵 无从下手啊 普通公司可能会希望找你这样的熟手 但是大公司么 框架基本都是自己开发 类库啊什么的 比如我知道的阿里的js库 至于iOS面试安卓 要我说啊 你知道人家只是做iOS的吗 说不定人家上个月撸服务器呢 这个月刚好分配做 iOS 而且分分钟上手了 最后勉励一下 我现在也打算在代码的设计上 以及算法上下功夫 不想只做一个API调用者 邹云浩的回答楼主刚毕业的?宝术的回答除了考察基本功之外,招聘还是有公司特色和运气的,腾讯以前曾规定不管招什么技术岗位,都要考C++,近两年才取消。因为腾讯是C++起家,Java在腾讯是小众语言,自然iOS会更重视,android相关技术一定没有iOS强势。
同样,阿里巴巴是Java起家,C++在阿里是小众语言,自然android会更受重视,我们面试iOS程序员都可能用Java面试官去面的,哈哈,简历一多,什么种类面试官都要上了。心理平衡一点吧,大公司是有更多资本筛选他要的人,只是适合不适合而已。如果你的基本功不扎实,进了腾讯也未必能有很好的晋升机会,因为长远来看大公司要的是写组件的人,而不是用组件的人。AF知识网用户的回答面试的时候,面试官交流表象枝叶特征的知识点,侧面证明他对你的工作能力质疑。
如果交流的是本质的通用的架构特征的知识点,侧面证明他认可了你的工作经验,探讨的是你未来的职业可能性以及是否能够胜任未知需求。蒋奇的回答码农就是打杂的„„具体产品设计、需求啥的不是产品经理和设计师的工作嘛,人家分工明确釜山的回答数据结构和算法,程序员永远的话题!AF知识网用户的回答我猜是因为腾讯想统一多平台风格 而统一多平台风格在中国最省事的办法就是都用iphone风格
技术永远以市场为导向。对于这个产品来说钻研android的投入产出比不经济吧。卢景伦的回答先回答题主第一个关于为什么被鄙视的问题。
其实说真的考官没错,最大原因在于:微信部门在整个腾讯地位超然,看作是未来的第二个互娱。这个原因就导致不管是内部员工还是外部人才均涌向微信。在这个可大量挑选牛人的基础上,提问的人不具有任何明显优于其他人的特长(在你描述中)。这里不是说提问的人没能力,但是我作为android开发来说,android开发比桌面开发 web开发 后台linux开发要更难吗?所谓android开发 桌面开发在你深入了解其中原理后有区别吗?· 这个哪个方面的考官面试你根本不重要,ios android在内部t3级人物看来不过是需要一两个月就能玩得比我们更溜的东西而已,比window开发 后台linux开发简单多了。
再稍微说下关于微信android iPhone风格问题~~这不是程序猿能够决定的东西~~~~~·
1、添加权限:AndroidManifest.xml中必须使用许可“Android.permission.INTERNET”,否则会出web page not available错误。
2、在要Activity中生成一个WebView组件:WebView webView = new WebView(this);
3、设置WebView基本信息:
如果访问的页面中有Javascript,则webview必须设置支持Javascript。
webview.getSettings().setJavaScriptEnabled(true);
触摸焦点起作用
requestFocus();
取消滚动条
this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
4、设置WevView要显示的网页:
互联网用:webView.loadUrl("");本地文件存放在:assets文件中
5、如果希望点击链接由自己处理,而不是新开Android的系统browser中响应该链接。给WebView添加一个事件监听对象(WebViewClient)
并重写其中的一些方法
shouldOverrideUrlLoading:对网页中超链接按钮的响应。
当按下某个连接时WebViewClient会调用这个方法,并传递参数:按下的url
onLoadResource
onPageStart
onPageFinish
onReceiveError
onReceivedHttpAuthRequest6、如果用webview点链接看了很多页以后,如果不做任何处理,点击系统“Back”键,整个浏览器会调用finish()而结束自身,如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity中处理并消费掉该Back事件。
覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法。
public boolean onKeyDown(int keyCoder,KeyEvent event){
if(webView.canGoBack()&& keyCoder == KeyEvent.KEYCODE_BACK){
webview.goBack();//goBack()表示返回webView的上一页面
return true;
}
return false;
在这段时间主要对Android平台有了一定的了解,对一些简单的设计也有了一定的掌握Android概念
Android是一个基于Linux核心的开放手持设备(主要是手机)平台操作系统,与Windows Moble、Symbian等手机操作系统处于同一级别。“Android大奖赛“首页上列出的可能设计方向
多媒体工具社交网络新闻、资讯工具环保、慈善协作生产力工具Android Developer Challenge(ADC)游戏实时资讯服务崭新的用户界面您想到的应用程序项目构架
src/:源代码(sourse)目录
“src”目录包含了“Android应用程序”各个程序源文件。对于上例 ”Bmi.java”是新 序项目中的主要程序块。gen/:自动生成(Generate)目录
gen目录中存放所有自动生成的文件。最关键就是R.java,这个文件是自动产生的,与”res”目录下的XML文件内容同步更新。
Android<版本号>/:参考函数目录
此目录的作用是将AndroidSDK里所有可呼叫的类、方法函数,分门别类的列出,好方便开发者来参考。
assert/:对此目录目前还不是太懂 res/:资源(Resource)目录
res目录存放所有程序中用到的资源文件。在里边还有两个经常访问的目录,分别 “layout/:页面布局(layout)目录”和“values/:参数值(values)目录”
“AndroidManifest.xml”是Android应用程序的功能列表,每个应用程序都在这个文件中,列出该程序所提供的功能。我完成的BMI程序
此程序是我参考书上的例子所完成的程序。
BMI,英文全称:Body Mass Index,中文名称:身高体重指数,是一个计算值,整个程序的思路是当我们在对应的文本框内输入身高(cm)、体重(kg),输入完成后按下“计算BMI”键,屏幕上就会显示计算结果,并弹出“你应该节食”、或“你应该多吃点”等健康建议的信息框。
健康指标的计算方法是:身高(height)/(体重(weight)/100)只要BMI值超过25时就算偏胖、BMI值低于20就算偏瘦,介于这之间算正常。
下面是我完成的程序界面:
计算得到的BMI值是20.57,在20—25之间,体型正常。由于我对两个文本框内输入的内容进行了限制,因此只容许输入数字
BMI值为25.56,信息框弹出“你该节食了”
在界面的下侧有一个“健康小常识按钮”,当点击此按钮时,会链接到一个有关健康生活小常识的网页上:
在每次点击“计算BMI值”按钮后首先会弹出一个消息框,消息框中包括两个按 钮,当点击确认按钮时消息框消失;当点击首页按钮时会连接到相应的网页
下图为点击消息框确认按钮后显示的网页:
总结
第一步:自己编写一个类 继承 SQLiteOpenHelper,如下
package com.example.wxj2048;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class Dbdao extends SQLiteOpenHelper{ private static final String DBNAME = “mldn.db”; private static final int DBVERSION = 1; private static final String TABNAME = “game2048”; public Dbdao(Context context){ super(context, DBNAME, null, DBVERSION); } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub String sql =“ CREATE TABLE ”+ TABNAME+“ (” + “ id INTEGER ,” + “ score INTEGER ”+ “) ”; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub String sql = “ DROP TABLE IF EXISTS ” + TABNAME; db.execSQL(sql); this.onCreate(db); } public void insert(Integer score){ SQLiteDatabase db = getWritableDatabase; ContentValues values = new ContentValues(); values.put(“id”, 1); values.put(“score”, score); db.insert(TABNAME, null, values); db.close(); } public void delete(){ SQLiteDatabase db = getWritableDatabase(); String[] data = new String[1]; data[0] = “1”; db.delete(TABNAME,“id = ?”,data); db.close(); } public Integer query(){ SQLiteDatabase db = getWritableDatabase(); Cursor c = db.query(TABNAME, null, null, null, null, null, null); c.moveToFirst(); int index = c.getColumnIndex(“score”); String result = c.getString(index); db.close(); return Integer.valueOf(result); }}
第二步;就可以创建 Dbdao 对象,然后使用数据库
我们总结一下 Cursor 的重要方法
close()
关闭游标,释放资源
getColumnCount()
返回所有列的总数
getColumnIndex(String columnName)
返回指定列的名称,如果不存在返回-1
getColumnName(int columnIndex)
从给定的索引返回列名
getColumnNames()
返回一个字符串数组的列名
getCount()
返回Cursor 中的行数
moveToFirst()
移动光标到第一行
moveToLast()
移动光标到最后一行
moveToNext()
移动光标到下一行
访问 Cursor 的下标获得其中的数据
int nameColumnIndex = cur.getColumnIndex(People.NAME);
前言
本文分五部分:Android电信业务系统、RIL、Telephony APP Framework、Phone APP、Android通话简单流程。
1、Android电信业务系统主要叙述Android整个电信业务系统的软件架构。
2、RIL主要叙述Android Radio Interface Layer相关要点,涉及的代码主要放在hardwareril目录下。
3、Telephony APP Framework主要简述电信业务系统Framework部分代码相关要点,涉及的代码主要放在frameworksbasetelephony目录下。
4、Phone APP主要叙述Android的电话业务模块,涉及的代码主要放在packagesappsPhone目录下。
5、Android通话简单流程主要叙述从上层Phone APP发起电话的函数调用流程。
一、Android电话业务系统
简单的说由三部分组成:Telephony Application(Java)+ Telephony Frameworks(Java)+ RIL(C/C++)
二、RIL RIL(Radio Interface Layer),是Android电信业务系统和底层硬件之间的抽象层,Android提供该层方便用户移植。手机每次请求相应的电信服务,如电话、短信、网络连接等,都是通过AT指令与底层硬件进行交互的,拿电话来讲,用户请求拨打电话,需要向RIL发送相关的请求,接着RIL按照用户的请求,调用相应的AT指令发送接口给底层发送AT指令,完成用户拨打电话的流程。简单的说,对RIL的移植,主要是针对不同的设备针对AT指令做相应的修改。
1、RIL移植层的三个组成部分
1)Vendor RIL 提供AT指令发送接口 2)RIL Daemon 加载RIL相关的库同时初始化RIL,注册RIL相关函数接口。同时,RILD也是上层和底层RIL的调用中转站。3)RIL JNI Layer RIL JNI接口,提供上层Telephony APP Framework调用
2、RIL的初始化流程
加载ril.lib RIL_Init() RIL_register(),详细可见ridl.c中的main()函数。
3、RIL接口的调用方式
有两种方式:主动请求(Solicited)和被动请求(Unsolicited)1)主动请求
2)被动请求
void(*OnUnsolicitedResponse)(int unsolResponse, const void *data,size_t datalen);
4、涉及的主要源代码文件
1)reference-ril.c 本文件涉及的重要内部函数及功能 requestRadioPower
开启通讯模块 requestQueryNetworkSelectionMode 查询网络模式 requestGetCurrentCalls
获取当前通话 requestDial
请求呼叫 requestWriteSmsToSim
写入短信至SIM卡 requestHangup
挂断电话 requestSignalStrength
获取信号强度 requestRegistrationState
获取卡注册状态 requestOperator
获取运营商名称 requestSendSMS
请求发送短信 requestSetupDataCall
拨号上网 requestSMSAcknowledge
短信回报
requestEnterSimPin
请求输入SIM PIN码 requestSendUSSD
请求USSD业务 本文件提供给ril.cpp调用的外部接口 RIL_Init
RIL初始化 onRequest
AT请求指令接口(异步方式)
getVersion
获取RIL版本号,当前为“android reference-ril 1.0” onUnsolicited
AT请求指令接口(同步方式)
2)ril.cpp 该文件主要提供ril.java调用接口,实现RIL的JNI调用方式、RIL Event管理机制 实现了供上层调用的接口 typedef struct {
int requestNumber;
void(*dispatchFunction)(Parcel &p, struct RequestInfo *pRI);
int(*responseFunction)(Parcel &p, void *response, size_t responselen);} CommandInfo;具体执行的操作可以看头文件ril_commands.h 举一个例子:
拨打电话,对应的requestNumber为RIL_REQUEST_DIAL,对应的dispatchFunction为dispatchDial,对应的responseFunction为responseFunction。 RIL Event管理
与ril_event.cpp的Event接口配合实现RIL Event管理 RIL_startEventLoop rilEventAddWakeup eventLoop ril_event_init ril_event_set ril_event_add ril_event_del 4)rild.c rild的主要初始化工作都在main函数中进行。
5、RIL JNI上层对外接口
SetOnNITZTime
getIccCardStatus
supplyIccPin
supplyIccPuk
supplyIccPin2
supplyIccPuk2
changeIccPin
changeIccPin2
getCurrentCalls
getPDPContextList dial
getIMSI
getIMEI
getIMEISV
hangupConnection
acceptCall
rejectCall
getLastCallFailCause getLastPdpFailCause getLastDataCallFailCause setMute
getMute
getSignalStrength
getRegistrationState getGPRSRegistrationState getOperator
设置网络身份和时区 获取SIM卡状态 输入PIN码 输入PUK码 输入PIN2码 输入PUK2码 修改PIN码 修改PIN2码 获取当前通话 获取PDP列表 拨号
获取IMSI 获取IMEI 获取IMEISV 挂断电话 接听电话 电话拒接
获取Call失败错误码 获取PDP失败错误码 获取拨号连接失败错误码
设置手机静音模式(静音/非静音)获取手机静音模式(静音/非静音)获取信号强度 获取卡注册状态 获取GPRS注册状态 获取运营商 sendDtmf
startDtmf stopDtmf sendSMS deleteSmsOnSim writeSmsToSim
发送DTMF Start DTMF Stop DTMF 发送短信
删除SIM卡短信 保存短信至SIM卡
6、RIL机制
RIL类有三个内部类:RILRequest、RILSender、RILReceiver,这三个内部类共同实现上层的电信业务操作请求。
RILRequest,电信服务请求,上层应用通过该类与RIL JNI层进行消息的交互,同时RIL JNI层也通过该类与RIL底层进行消息的交互; RILSender,实现上层请求的命令发送 RILReceiver,负责接收底层的Response 以下是dial的RIL调用序列 上层调用dial 设置Request请求并发送至RILSender消息处理队列
RILRequest rr = RILRequest.obtain(RIL_REQUEST_DIAL, result);…
send(rr); RILSender消息处理队列消息队列收到EVENT_SEND后往mSocket里边填写相应请求 RILD从mSocket中读取相应的请求为RIL_REQUEST_DIAL,并设置相应的event 执行dispatchDial onRequest requestDial发送AT指令
底层给予responseVoid的响应
RILD向mSocket填写相应的响应信息,并往RILReceiver消息队列发送 processResponse processSolicited responseVoid(JNI)
三、Telephony APP Framework概述
电信业务Framework涉及Call、SMS、SIM卡、PDP等,代码分为两个部分,一个是SDK API,一个是平台内部类,不对外开放。这部分简单的说,就是上层电信业务与底层RIL的中间层。
1、Internal Class 1)ADN(Abbreviated Dialing Numbers,缩位拨号)相关的类 AdnRecord AdnRecordCache AdnRecordLoader 2)Call相关的类
Call:基类,GsmCall和CdmaCall都由该基类扩展实现 CdmaCal GsmCall
CallTracker:基类,GsmCallTracker和CdmaCallTracker都由这个基类进行扩展实现 GsmCallTracker: CdmaCallTracker PhoneBase:基类,CDMAPhone和GSMPhone都由这个基类扩展实现 CDMAPhone GSMPhone Phone:电话操作的一些接口 CallerInfo CallerInfoAsyncQuery CallForwardInfo:呼叫转移
CallFailCause:GSM Call失败错误码 CallFailCause:CDMA Call失败错误码 3)数据连接相关类
DataConnection:基类,GsmDataConnection和CdmaDataConnection都基于该类扩展实现 GsmDataConnection CdmaDataConnection DataConnectionTracker:基类,CdmaDataConnectionTracker和GsmDataConnectionTracker都基于该类进行扩展实现 CdmaDataConnectionTracker GsmDataConnectionTracker 4)SIM卡相关类
IccCard:基类,RuimCard和SimCard都由该类进行扩展实现 RuimCard SimCard IccRecords:基类,RuimRecords和SIMRecords都基于该类进行扩展实现 RuimRecords SIMRecords IccProvider IccUtils 5)SMS相关类
SMSDispatcher:实现发送短信
SmsMessageBase:基类,SmsMessage由该类扩展实现 SmsMessage:短信PDU包解析
2、SDK API Class 实现SDK API接口,具体架构见SDK API文档
四、Phone APP Android自带一个Phone App,实现了GSM/CDMA的通话功能,这部分代码放在packagesappsPhone目录下。
Phone APP开机就运行了,可以从AndroidManifest.xml设置的应用权限看出来
A、初始化Telephony Framework B、Power、Ringer、Keyboard、状态栏、SIM卡的注册工作 C、CallNotifier、PhoneUtils初始化工作 具体可以参见onCreate Phone APP有如下几个重要的类
PhoneApp requestWakeState:判断手机是否可休眠 wakeUpScreen:唤醒手机
PhoneAppBroadcastReceiver:内部类,可以实时监测手机的状态,飞行模式、蓝牙耳机等。 PhoneUtils 电话基本组件接口,实现电话的一些基本操作,如Dial、Answer、Hangup、Hold等 placeCall:电话呼出 Hangup:挂断电话 answerCall:接听电话
setMute/ setMuteInternal:静音 turnOnSpeaker:免提
showIncomingCallUi:显示来电界面 InCallScreen 该类实现通话界面流程,主要如下:
case R.id.menuAnswerAndHold,保持当前通话并接听: internalAnswerCall PhoneUtils.answerCall(mPhone)case R.id.menuAnswerAndEnd,结束当前通话并接听:
internalAnswerAndEnd PhoneUtils.answerAndEndActive(mPhone)case R.id.menuAnswer,接听:
internalAnswerCall PhoneUtils.answerCall(mPhone)case R.id.menuIgnore,忽略:
internalHangupRingingCall PhoneUtils.hangupRingingCall(mPhone)case R.id.menuSwapCalls,切换通话:
internalSwapCalls PhoneUtils.switchHoldingAndActive(mPhone)case R.id.menuMergeCalls,合并通话: PhoneUtils.mergeCalls(mPhone)case R.id.menuManageConference,管理电话会议:
setInCallScreenMode(InCallScreenMode.MANAGE_CONFERENCE)case R.id.menuShowDialpad,显示拨号键盘: onShowHideDialpad mDialer.openDialer(true)case R.id.menuSpeaker,免提:
onSpeakerClick PhoneUtils.turnOnSpeaker case R.id.menuBluetooth,蓝牙: onBluetoothClick case R.id.menuMute,静音:
onMuteClick PhoneUtils.setMute case R.id.menuHold,通话保持: onHoldClick case R.id.menuAddCall,添加通话: PhoneUtils.startNewCall(mPhone)case R.id.menuEndCall,结束通话: internalHangup PhoneUtils.hangup(mPhone) DTMFTwelveKeyDialer 该类实现DTMF processDtmf:发送DTMF clearDigits:清除DTMF键码 startDtmfTone:播放DTMF Tone stopDtmfTone:停止播放DTMF Tone CallNotifier 继承于Handler,用来实时监测通话状态并通知Phone Application,如PHONE_NEW_RINGING_CONNECTION(来电),PHONE_INCOMING_RING(来电响铃),PHONE_DISCONNECT(通话挂断),PHONE_BATTERY_LOW(电池电量低),具体相对应的处理可参见handleMessage CallFeaturesSetting 实现通话设置,此外该类包含一个内部类VoiceMailProviderSettings用来实现语音信箱的设置
CallCard/ InCallTouchUi 这两个类都是继承于FrameLayout,Phone用来实现通话自身的布局需求。
updatePhotoForCallState:更新替代图片(如果通话号码有设置特定代替图片的)updateDisplayForConference:通话UI更新(用于电话会议)updateDisplayForPerson:通话UI更新
getCallFailedString:获取通话失败错误字符串 displayOnHoldCallStatus:显示通话保持UI displayMainCallStatus:更新通话UI updateState:更新通话状态(供外部类调用) BluetoothHandsfree/BluetoothHeadsetService 实现通话蓝牙耳机功能,其实现核心是BluetoothHeadsetService,在PhoneApp 创建的时候会启动它。BluetoothHeadsetService 通过接收底层蓝牙服务的状态消息来改变自身状态,同时它也会监听通话的状态变化。onBluetoothEnabled:开启蓝牙设备 onBluetoothDisabled:关闭蓝牙设备 connectHeadset:连接蓝牙设备 audioOn:开启audio audioOff:关闭audio redial:通过蓝牙设备重播电话 updateBatteryState:更新电池强度 updateSignalState:更新信号强度
五、Android通话简单流程
1、拨打流程(以电话本入口为例)
进入电话本,以某个联系人发起呼叫,此时进入TwelveKeyDialer类的onClick函数case R.id.dialButton分支,启动OutgoingCallBroadcaster Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//以新的TASK启动 OutgoingCallBroadcaster发出Broadcast Announcement sendOrderedBroadcast(broadcastIntent, PERMISSION,new OutgoingCallReceiver(), null, Activity.RESULT_OK, number, null);收到Broadcast后,进入OutgoingCallReceiver中的doReceive启动InCallScreen 进入internalResolveIntent mInCallInitialStatus = internalResolveIntent(getIntent());placeCall PhoneUtils.placeCallVia/ PhoneUtils.placeCall Connection cn = phone.dial(number);Phone是Interface,所属的dial接口是在PhoneBase的子类GSMPhone中实现 进入GsmCallTracker类中的dial函数 mCT.dial(newDialString);调用CommandsInterface的dial接口
cm.dial(pendingMO.address, clirMode, obtainCompleteMessage());CommandsInterface的dial接口是在RIL.java中实现的 调用JNI接口dial ……后续就是RIL JNI与libril的交互过程,见RIL机制
2、来电流程
CallNotifier的消息处理队列会收到PHONE_NEW_RINGING_CONNECTION onNewRingingConnection响铃或震动(来电自动接听也在里边处理)显示来电界面InCallScreen PhoneUtils.showIncomingCallUi();
3、来电处理
接听
internalAnswerCall
PhoneUtils.answerCall(mPhone)
关闭来电铃声等,进入接听流程phone.acceptCall()调用GsmCallTracker的acceptCall mCT.acceptCall();调用CommandsInterface acceptCall 接口 cm.acceptCall(obtainCompleteMessage())
调用RIL JNI接口acceptCall向底层发送请求
……后续就是RIL JNI与libril的交互过程,见RIL机制 挂断
internalHangup PhoneUtils.hangup(mPhone) 调用GsmCallTracker的handup 调用CommandsInterface hangupConnection接口
cm.hangupConnection(conn.getGSMIndex(), obtainCompleteMessage());调用RIL JNI接口hangupConnection向底层发送挂断请求 ……后续就是RIL JNI与libril的交互过程,见RIL机制 通话保持恢复
PhoneUtils.switchHoldingAndActive(mPhone) 添加一个新通话,实现多方通话 PhoneUtils.startNewCall(mPhone)
Android_Phone源代码来电流程解读
***************************CallNotifier***************************
本类extends Handler并且implements CallerInfoAsyncQuery.OnQueryCompleteListener
电话状态改变之后本类会接到Message,然后本Handler通过Message的不同,进入不同的case:
然后调用不同的方法处理各种状态改变。
同时实现了OnQueryCompleteListener接口,当来电的时候会帮助执行查询操作,比如查询并调用
Ringer设置响铃方式。
当来电时,本类会接受到一个PHONE_NEW_RINGING_CONNECTION(Message.what),然后调用对应的方法
onNewRingingConnection(),该方法又会调用startIncomingCallQuery()方法,该方法就查询用户
设置的铃声(可能是系统的,也可能是用户自定义的),如果查询完成则直接调用onQueryComplete().假如执行超时的话,将会发送一个延时Message,延时后将默认调用系统的铃声。
假如在延时发送Message过程中Query已经完成,由于CallNotifier实现了OnQueryCopleteListener,就会自动调用onQueryComplete()方法,该方法将会首先把可能存在的延时Message给Remove,以防止
再次设置铃声。接着调用onCustomRingQueryComplete()方法。然后该方法里面会调用Ringer的ring()
方法启动响铃。
********************************Ringer*************************** Ringer的ring()方法会启动相应的响铃方式。
响铃之后将会又Message发送,其内容为PHONE_STATE_CHANGED
*******************************InCallScreen**********************
InCallScreen将会接受到发送的PHONE_STATE_CHANGED消息,然后调用onPhoneStateChanged()方法
该方法将更新屏幕,CallNotifier的onCustomRingQueryComplete里也会通过PhoneUtils.showIncomingCallUi()
来启动InCallScreen屏幕。然后由InCallScreen处理,处理方式与前面打电话的大体一致,不过该类第一次调用时执行了
【android面试总结】推荐阅读:
android面试宝典02-08
android 高级面试题10-24
android面试题和答案09-21
android总结05-16
Android 个人总结07-19
android实习总结11-07
android实习日记07-15
android商品管理07-19
android实验报告03-03
android开发案例教程11-24