高级工程师面试题

转自:https://blog.csdn.net/fishmai/article/details/51981827

高级工程师面试题

1、 Service两种方式的区别
2、 Handler在项目怎么用的,线程间如何通信的
3、 AsyncTask和AsyncQueryHandler
4、 HttpClient,HttpUrlConnection的区别
5、 消息推送机制xmpp协议,客户端发送服务器好处理,只要知道服务器IP就可以,服务器如何给客户端推送消息呢
6、 oauth认证
7、 HTML和XML的区别、
8、 多线程断点续传下载如何实现续传的
9、 TCP、UDP的区别
10、 aidl开发
11、 Android中JNI和NDK的使用,了解WebService调用技术
12、 Android安全机制,垃圾回收机制
14、 屏幕适配
15、 android ui的几个概念:px,dip(dp),sp,dpi,分辨率等,dpi是在Android资源随着不同手机的分辨率自动进行适配,res-》drawable-hdpi
16、 Launcher如何设置壁纸
17、 baiduMap如何用,用百度地图的坐标为甚么显示pc会出现很大的偏差,如何避免呢?
18、 哪个项目是你印象最深

 

1.为了降低android程序的内存使用峰值和APK文件的大小,我们一般使用_____________工具对资源图进行额外处理。


2.Android系统会自动派发各种事件,事件从触发到相应的程序相应的派发顺序是_________。

3.发布Android程序时,APK文件要先签名,再用Zipalign做4字节对齐。( )

4.实现多个进程共享数据的时候,只要设置AndroidManifest文件的shareUserId属性即可,签名可以不一致( )。


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


6.如果一个Activity被设置为“singleTop”模式并且还驻留在后台,此时再通过startActivity启动这个Activity时,Activity的_______________成员函数会被最先回调到,我们一般在这个回调函数中来处理相关逻辑。


PS:3、4题是判断题,其它是填空题

 

********************************************************

 

个人稍微回答下。可能有很多不足之处,仅作借鉴

 

问题1

为了降低android程序的内存使用峰值和APK文件的大小,我们一般使用_____________工具对资源图进行额外处理。

  答:这个估计一般人都知道了,就是9图工具。而且这个工具真的很好用,就我几个阶段反编译一些apk文件来看。比如一年前的时候的应用,基本没有用到这块,除了几个大型公司做的app,用到了工具。2011年末的几个应用,9妹就来势汹汹了。而且发现9图后图片除了能更好的适配防拉伸效果等,还微微减小了图片大小。同时因为能做多适配和大小缩放不失真的调整,间接的就减少了做多套适配图片而增减资源包的臃肿。

 

问题2:

Android系统会自动派发各种事件,事件从触发到相应的程序相应的派发顺序是_________。

  答:这个涉及到Framework层了。本人没怎么接触。看关于这个帖子的这个题有人给出过两种答案:

  1.EventHub->KeyInputQueue->WindowManagerService->ViewRoot->...

  2.WindowsManager->phoneWiondw->Activity

 

  其实两个想表达的意思是差不多的。就是一个服务队列,接受到事件。从队列中将该事件分发给WindowManagerService也就是窗口管理类服务,然后分发个对应的窗口Window,窗口中有个主View,主View又分由上而下子View。这里就要提到两个函数,也是刚开始我搞晕了的两个函数:第一个是dispatchXXXXEvent和onXXXX(onTouchEvent,onKeyDown);以前对这个onxxxx的重写时很多的,这个dispatchXXX基本是没用过。然后我一直也没明白这个派发机制的干嘛的。后来看下了源代码会发现,dispatch分发传递到最后一层时,就执行了onxx事件。说白了就是dispatch是发送事件,onxx是处理事件。

  1.   public boolean dispatchTouchEvent(MotionEvent event) {
  2.         if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
  3.                 mOnTouchListener.onTouch(this, event)) {
  4.             return true;
  5.         }
  6.         return onTouchEvent(event);
  7.     }

复制代码

  这是View中的一段代码。

 

  具体关于分发事件的可以查考该博文:Android FrameWork——Touch事件派发过程详解。不太明白的也没事。可以看个大致流程,呵呵。

 

问题3:

发布Android程序时,APK文件要先签名,再用Zipalign做4字节对齐。( )

  答:这个是判断题,无论你知不知道,好歹还能蒙一个。先说下答案,对的。以我的了解。这题出的其实比较偏门,偏门的意思是大部分人都不会关心这个。我也是在最近弄Ant自动打包时,才是熟悉了下这个问题。因为ant脚本这玩意我也是第一次玩,看了下资料,以及基本语法和书写方式。一般我们打包可能直接用adt工具了,说白了它就是集成了一个打包工具。ant只不过就是我们自己来写而已,里面涉及到很多javac,zipalign和proguard什么的,就是把一些工具的命令行操作语句窜起来。然后接触到要使用一个zipalign优化工具简答了解下:这是一个归档对其工具,对资源做了优化,对未压缩的数据做了某种意义上的4字节对其。

  具体为什么这个顺序是对的呢。不知道这图算不算一种说明方式:

 

 

 

  这是我打完一个未签名包后,工具的提示。

  对于为什么出这样的题,估计是是想看应聘者是否去接触过一些细节和工具,或是对于ant打包的接触?

 

问题4:

实现多个进程共享数据的时候,只要设置AndroidManifest文件的shareUserId属性即可,签名可以不一致( )。

  答:/***是。具体原因就不知了。**/

  这里先谢谢下面评论中那个哥们,确实对于我可能测试过的几个问题我都做了详细回答。这个因为没有测试,就完全是copy了那会论坛下的几个答案,以为做个总体答案的记录就行了。这是刚测试后的答案。答;不能。因为设置了shareUserId后,在你应用安装的时候系统在对读取配置文件安装信息时就会检测这个问题,既你的A应用和B应用实现了shareUserId一样。

但是在安装时签名不一样的话,安装过程就是失败的。

 

 

问题5:

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

  答案:/****   网上查了一下,第五题应该是GetJavaVM, DestroyJavaVM() .copy来的答案。。也不是很懂。****/

  答:这个问题原来只是copy过来的一份答案。谢谢 Innost 前辈对错误指出。涉及到底层的,有很多不足,首先也说下做这块总结只要是想把这几个问题有个还算靠谱的答案,因为现在google或是百度下这几个问题,都只是给出了题目,下面有回答和讨论的。我这边只是想做个简单归档,可能有很多不足,希望指正或是给下更好的答案。上班抽闲大致花了1-2小时看了下这方面的资料。因为本人对C这块不熟,看的其实有点吃力。JavaVM和JavaEnv的概念。

  (因为答案基本围绕了这两个在讨论, Innost 也提到说看下这个概念)。JavaVM即java虚拟机,主要是一个进程(也就是多个线程来访问),简单说就是在一个应用进程启动后背创建。JavaEnv,虚拟机环境,这个是只能被他创建的线程来访问,里面持有该线程访问的数据。利用jvm可以获取当前线程的env。然后通过两个函数,来实现环境依附跨线程的访问和访问完后的释放。

  1. [java] view plaincopy
  2.  
  3. jint AttachCurrentThread(void **penv, void *args) {
  4.        return functions->AttachCurrentThread(this, penv, args);
  5.    }
  6.  

复制代码

  1. [java] view plaincopy
  2.  
  3.  
  4.  
  5. jint DetachCurrentThread() {
  6.        return functions->DetachCurrentThread(this);
  7.    }
  8.  

复制代码

  这两个函数定义可以在jni.h中找到。

 

  这边其实有考虑到两个参数 _jvm和_env.因为看下上面的代码是通过jvm调用 AttachCurrentThread来获取_env,那_jvm这个参数又是何时获取,怎么获取的。

这个是网上copy的一份解说:

/----------------------------------------------------

JavaVM接口

第一种方式,在加载动态链接库的时候,JVM会调用JNI_OnLoad(JavaVM* jvm, void* reserved)(如果定义了该函数)。第一个参数会传入JavaVM指针。

第二种方式,在native code中调用JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args)可以得到JavaVM指针。
两种情况下,都可以用全局变量,比如JavaVM* g_jvm来保存获得的指针以便在任意上下文中使用。
Android系统是利用第二种方式Invocation interface来创建JVM的。

JNIEnv接口
JNI开发最常见的错误就是滥用了JNIEnv接口。需要强调的是JNIEnv是跟线程相关的。
在native method中,JNIEnv作为第一个参数传入。那么在JNIEnv不作为参数传入的时候,该如何获得它?JNI提供了两个函数:(*jvm)->AttachCurrentThread(jvm, (void**)&env, NULL)和(*jvm)->GetEnv(jvm, (void**)&env, JNI_VERSION_1_2)。两个函数都利用JavaVM接口获得JNIEnv接口。

----------------------------------------------------/

其实这块挺晕的:

看jni.h中对于jvm好env获取是这样的定义。

env->GetJavaVM(&g_vm);

jvm->AttachCurrentThread(&e, &thread_args);

就是通过env获取虚拟机,通过虚拟机获取env。。。。有点先有蛋还是鸡的味道。

对于Android调用了jni几块,比如mediaPlayer模块。我看下了,发现env这个都是自己传进去。

其实还是很不懂。

只是先把这个错误答案改过来。

其实对于上面这个先调用获取jvm理论上也是对的,获取jvm后在获取env。对于后面这个空说销毁jvm可能就不对了。

本题的中心可能主要还是围绕env这个来说事。

更多详情可以看下下面老兄的建议。

 

问题6:

如果一个Activity被设置为“singleTop”模式并且还驻留在后台,此时再通过startActivity启动这个Activity时,Activity的___成员函数会被最先回调到,我们一般在这个回调函数中来处理相关逻辑。

  答案:onNewIntent().singTask模式的亦是如此。这个因为刚接触过。想singleTop和singleTask除了一般说的防止产生大量的相同的Activity对象,产生内存中的冗余,

同时也可以很巧妙的解决一些问题。我有一个固定的Activity,比如简单的某个购物应用的购物栏界面。即,用户在每个购物界面点击添加购买后都会跳转到这个界面然后添加相应的购买商品条目。如果是一般的启动模式,我每次点击添加购买,就重新启动了一个购物车界面,并且在这个界面中也没有前面几次已经购买的商品条目,于我们的思路相违背。因此这个购物栏界面,理论上我就可以设计成一个单例。这样也就同样很容易的解释了这个题目的初衷了吧。因为一般面试官不可能只是看下你的答案,更多的会问下你几种启动模式的运用场景。这里也顺便提及下4种启动模式。这个不算冷门也很实用的知识,可以注意下,同时也可以大致的了解Android中关于Task的知识。

 

以上即是整理的一部分面试题,做了下记录和如果是我的话来做的一些看法

*********************************************************************************************/

以下是我最近觉得自己想到的几个问题。

 

  因为最近说招人的时候,可能部分有2年左右工作经验,1年以上Android开发经验的应聘者,基本薪资都要求在1w上了。于是对于面试的问题也不能仅仅只局限于笔试题这些做烂了的题目或是对方说下某个项目产品的流程框架模块实现什么的。可能更多会要问一下,对于应用界面功能,交互设计的看法,以及如何编码实现一个不失优雅的和功能性的首页面。然后是对于应用常见异常和错误的分析以及解决方式,再简单和细分点就是对于资源代码的优化,自动打包和测试,应用的防篡改和反编译。

 

题目一;

功能性界面的实现,比如记住用户名这个功能。

  答:当然,对于初级可能会问按钮按下非按下的效果的实现,也就是选择器的应用。(但是真的,还有人会回答你,监听按钮事件然后代码来实现setbackground。。。)

言归正传,这个其实应该是很常见功能性界面。一般都是知道大致的思路的,用个偏好设置,保存一下就ok了。那么再细点呢。这个偏好设置要保存的基友几个参数,用户名,密码,然后呢?对了,那就是是否选折记住用户名密码的这个checkbox。因为我一开始做的时候忘记保存这个了。每次无论是否是checkbox是何种状态,我都保存和读取用户名和密码去了。。。

因此简单的:

 

图画的比较搓。。因为不太会用。

当你能把大致思路理清后,那么面试的就知道,这事你能解决,而不是笼统的说,用偏好设置啊。这就好比,在论坛中常看到这样的帖子和问答。

这个界面布局怎么实现。回答:相对布局。

好忧郁的回答。。

当然,最后也要看出题人出的题目,对提问人的要求,首先,该功能性代码量和思路要竟可能的能在短时间完成,并且不是模糊性的。

 

问题二:

代码混淆和压缩优化打包输出。

  答:说白了,就是想问下你对progurad是否熟悉以及接触过。问这个问题其实是我自己也不懂,只会最简单的一句话傻瓜配置。但是又想做自定义的配置。

然后老大说了:对于面试时,你可以问下你自己遇到的,不能解决的问题。呵呵。

对于第三方jar包加入报错的处理,混淆后应用运行的异常。

当然,这块问题其实也是渐渐的必须要了解的东西,因为现在的大部分应用基本都重视被反编译的问题了。

问这个,第一点看面试者是否接触过,如果很熟悉,在原来的项目运用过,自定义配置过,那最好了。

第二点,如果没有,那么没事,可能却是没用到,那么就看对方是不是自己主动去了解过,简单说,是否有所谓热爱追求新技术,知识的汲取不仅仅局限于当前,有善于发现和进取的心。

 

问题三:

代码测试以及优化的了解?

  答:这个可能就觉得这面试官比较傻逼和笼统了。确实,这问题闻到有点蛋疼。

其实稍微转化下可以问面试者对于原来项目完成后,是否做过测试框架和代码优化调试。

当然,这个是比较高层次了,因为对于自动化测试什么的,我知道的国内可能就一些大型公司会刻意去定制一套测试机制和框架。

问这个问题,其实也是自己的私心,因为我也想了解下一般,功能性测试框架或是界面交互性测试框架,个位大牛是如何实现。

对于代码优化,是否有一套自己成熟的方案。让我也入入门呗。

对于这个问题,其实你只要能说出自己的想法就可以了,如果你切好做过,那就更棒了。以及碰巧说你简单的用过sdktools下的monkey(测试工具)或是TraceViewer(性能追踪工具),那也不错,说明你知道自己去接触。而不是纯粹在那一味写代码。

 

问题四:

自定义的UI设计。

  答:问这个问题其实每个公司可以参考自己产品的用户体验和视觉体验来问。

当然,既然问的是高手,你就不能傻乎乎的问,比如一个半透明或是dialog风格的的Activity的实现。

简单点的可以问下如何自定一个界面的加载动画,自定义的dialog。。

然后如果联系到自身的产品:第一点,由于目前我们的产品的某一个Activity的界面要展示的内容比较多,又不想简单的说用一个scrollView拖拉来实现,如何最有效的的利用有限的界面空间 1>.使用折叠效果的textView,这个也是一个朋友提到的,具体可以产考目前各大app商店,点击某个应用后,产品简介的那个空间。 2>.抽屉效果,这个其实是个不错的效果,具体代码其实网上大把的有,只要你能说出个思路就差不多,因为其实面试人也不是太懂,或者也只是借鉴网上而实现过。

第二点:自定义的首界面元素。因为我们应用可能下个版本要实现用户自定义的首界面。这个可以参考手机桌面图标拖拉,添加删除效果。这个效果其实有点难度,长按后的界面浮动效果,用户自定义后的配置保存。活着还带点什么特效,自动排序。对于这个涉及到的知识可能就多了,首先可能要对Window和windowmanager这几个对象有很好的了解,配置保存格式或是表单的处理。

 

问题五:

Http和Socket协议,xml/json

  答:网络模块这个基本是每个公司都会问的一个问题。因为一个互联网应用,不可能不处理这块内容。

然后这个问题也是很笼统的,http可能会问下常用的头参数。这个其实没多大意义,但是也是很必要。按意义来说,正的写过很多次网络处理的人,其实也很少去真正了解下各个参数 的含义,可能就字符集,内容类型。其实深入点的可以这么问,是否在原来公司或是项目中f封装过自己的网络处理jar。因为很多公司的网络处理都不是说每个项目重新写起来的。然后对于传输格式的解析。xml就不说了,json这个对于普通对象的处理,对于数组对象的处理,以及是否自己修改过或是简单搞过自己的json解析器。因为Android自带的json解析,就那么九个类,还不带直接解析对象。用起来比较局限。

问这个问题,主要也不过是看看面试者是否真正接触和书写过网络模块。对于简历中的一句熟悉http xxxx,现在互联网应用基本没几个应用不使用网络模块吧,你的项目中是有这块内容,但是真正的你了解或是做过处理过的,那又有多少呢。

 

问题六:

3D动画特效或是游戏方面的

  答:3D动画。首先我觉得会做游戏的人脑子都是比较清晰的,那么多x,y坐标,中心点,旋转点,长,宽,高,角度。参数多的晕人。

对于简单的2D特效,可能都会,3D能?需要那几个辅助类,Camera 吧。游戏的话View和surfaceView框架的选择。通用的游戏模块分类(这里纯粹是私心哈哈)。我目前也真在学习接触。

百度 Android开发面试题 
 
本文来自安卓航班网整理搜集     www.apkway.com 
 
原文地址:http://www.apkway.com/forum.php?mod=viewthread&tid=2057 
1、 Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念 
  DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,
都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进
程,所以说可以认为是同一个概念。 
  2、sim卡的EF 文件有何作用 
  sim卡的文件系统有自己规范,主要是为了和手机通讯,sim本 
身可以有自己的操作系统,EF就是作存储并和手机通讯用的 
   
3、嵌入式操作系统内存管理有哪几种,各有何特性 ?   
  页式,段式,段页,用到了MMU,虚拟空间等技术 
   
  4、什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗? 
     
嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度
予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作
出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。主要用于工
业控制、军事设备、 
航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可
分为软实时和硬实时两种,而android是基于 linux内核的,因此属于软实时。  
     
5、一条最长的短信息约占多少byte? 
  中文70(包括标点),英文160个字节 
     6、 android中的动画有哪几类,它们的特点和区别是什么? 
  两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方
式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种 Frame动画,
传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。 
     
7、handler机制的原理 
  andriod提供了 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。 
    8、说说mvc模式的原理,它在android 中的运用 
   
MVC(Model_view_contraller)” 模型_视图_控制器”。 MVC应用程序总是由这
三个部分组成。Event(事件)导致Controller 改变Model或View,或者同时改
变两者。只要 Controller改变了Models的数据或者属性,所有依赖的View都
会自动更新。类似的,只要Controller改变了View,View会 
从潜在的Model中获取数据来刷新自己。 
     
View重绘和内存泄露的好像是面试经常问的问题 
  1. View的刷新: 
  在需要刷新的地方,使用handle.sendmessage发送信息,然后在handle的
getmessage里面执行invaliate或者postinvaliate. 
   2. GC内存泄露 
  出现情况: 
  1.数据库的cursor没有关闭 
  2.构造adapter时,没有使用缓存contentview 
    衍生listview的优化问题-----减少创建 view的对象,充分使用
contentview,可以使用一静态类来优化处理getview的过程/ 
   
3.Bitmap对象不使用时采用recycle()释放内存 
  4.activity中的对象的生命周期大于activity 
  调试方法: DDMS==> HEAPSZIE==>dataobject==>[Total Size] 
  还有其他问题,大家欢迎提出阿,可以是整体架构的,还有这个Hal层. 
    这篇文章会涉及到以下几个内容 
     
一    Activity的生命周期 
  二   让Activity变成一个窗口:Activity 属性设定 
  三   你后台的Activity被系统 
回收怎么办:onSaveInstanceState 
   
四   调用与被调用:我们的通信使者 - Intent 
  一 Activity的生命周期 
  和其他手机  平台  的应用程序一样,Android的应用程序的生命周期是被统
一掌控的,也就是说我们写的应用程序命运掌握在别人(系统)的手里,我们不
能改变它,只能学习并适应它。 
   
简单地说一下为什么是这样:我们手机在运行 一个应用程序的时候,有可能打进来电话发进来短信,或者没有电了,这时候程
序都会被中断,优先去服务电话的基本功能,另外系统也不允许你占用太多资源,
至少要保证电话功能吧,所以资源不足的时候也就有可能被干掉。言归正传,
Activity的基本生命周期如下代码所示: 
     
Java 代码 
  public class MyActivity extends Activity 
{      
protected void onCreate(Bundle savedInstanceState);         
protected void onStart();         
protected void onResume();      
protected void onPause();         
protected void onStop();      
protected void onDestroy();    
}      
你自己写的Activity会按需要 
重 载这些方法,onCreate是免不了的,在一个Activity正常启动的过程中,
他们被调用的顺序是 onCreate  -> onStart  ->onResume, 在Activity被干掉的
时候顺序是onPause  -> onStop  -> onDestroy ,这样就是一个完整的生命周期,
但是有人问了 
,程序正运行着呢来电话了,这个程序咋办?中止了呗,如果中止的时候新出的
一个Activity是全屏的那么:onPause->onStop ,恢复的时候
onStart->onResume ,如果打断 
这个应用程序的是一个Theme为Translucent 或者Dialog 的Activity那么只
是onPause ,恢复 
的时候onResume 。 
   
详细介绍一下这几个方法中系统在做什么以及我们应该做什么:      
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都有可能被系统干掉为
了保证程序的正确性,你要在onPause()里写上持久层操作的代码,将用户编辑
的内容都保存到存储介质上(一般 都是数据库)。实际工作中因为生命周期的
变化而带来的问题也很多,比如你的应用程序起了新的线程在跑,这时候中断了,
你还要去维护那个线程,是暂停还是杀 掉还是数据回滚,是吧?因为Activity
可能被杀掉,所以线程中使用的变量和一些界面元素就千万要注意了,一般我都
是采用Android的消息机制 [Handler,Message]来处理多线程和界面交互的问
题。这个我后面会讲一些,最近因为这些东西头已经很大了,等我理清思绪再跟
大家分享。 
     二   让Activity变成一个窗口:Activity属性设定 
  讲点轻松的吧,可能有人希望做出来的应用程序是一个漂浮在手机主界面的东
西,那么很  简单你只需要设置一下Activity的主题就可以了在
AndroidManifest.xml 中定义 Activity的地方一句话: 
  Xml代码 
  android 
:theme="@android:style/Theme.Dialog"   
  android:theme="@android:style/Theme.Dialog" 
这就使你的应用程序变成对话框的形式弹出来了,或者  Xml代码 
  android:theme="@android:style/Theme.Translucent" 
android:theme="@android:style/Theme.Translucent" 
就 变成半透明的,[友情提示-.-]类似的这种activity的属性可以在
android.R.styleable 类的AndroidManifestActivity 方法中看到,
AndroidManifest.xml中所有元素的属性的介绍都可以参考这个类
android.R.styleable 
     
上面说的是属性名称,具体有什么值是在android.R.style中 
可以看到,比如这个"@android:style/Theme.Dialog"就对应于
android.R.style.Theme_Dialog ,('_'换成'.' <--注意:这个是文章内容不是
笑脸)就可以用在描述文件 
中了,找找类定义和描述文件中的对应关系就都明白了。 
     
三     你后台的Activity被系统回收怎么办:onSaveInstanceState 
  当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的
Activity B       这个时候A会执行 
   
   Java代码 
  public   
void onSaveInstanceState(Bundle outState) {         
super.onSaveInstanceState(outState);       
outState.putLong("id", 1234567890);    
}   
public void 
onSaveInstanceState(Bundle outState) {      
B 完成以后又会来找A, 这个时候就有两种情况,一种是A被回收,一种是没有
被回收,被回  收的A就要重新调用onCreate()方法,不同于直接启动的是这
回 onCreate()里是带上参数  savedInstanceState,没被收回的就还是
onResume就好了。 
  savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你
维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate
就不会有它,所以用的时候要判断一下是否为空。 
   
Java代码 
  if(savedInstanceState !=null){    
        long id =savedInstanceState.getLong("id");   
}   
if(savedInstanceState !=null){         
就像官方的Notepad教程 
里的情况,你正在编辑某一个note,突然被中断,那么就把这个note的id记
住,再起来的时候就可以根据这个id去把那个note取出来,程序就完整一些。
这也是看你的应用需不需要保存什么,比如你的界面就是读取一个列表,那就不
需要特殊记住什么,哦, 
没准你需要记住滚动条的位置...   四      调用与被调用:我们的通信使者Intent 
     
要 说Intent了,Intent就是这个这个意图,应用程序间Intent进行交流,打
个电话啦,来个电话啦都会发Intent, 这个是Android架构的松耦合的精髓部
分,大大提高了组件的复用性,比如你要在你的应用程序中点击按钮,给某人打
电话,很简单啊,看下代码先: 
     
Java代码 :   
Intent intent = new Intent();    
intent.setAction(Intent.ACTION_CALL);    
intent.setData(Uri.parse("tel:"+ number));    
startActivity(intent);   复制代码 
扔出这样一个意图,系统看到了你的意图就唤醒了电话拨号程序,打出来电话。
什么读联系人,发短信啊,邮件啊,统统只需要扔出intent就好了,这个部分
设计地确实很好啊。 
     
那Intent通过什么来告诉系统需要谁来接受他呢? 
  通常使用Intent有两种方法,第一种是直接说明需要哪一个类来接收代码如
下: 
     
Java代码 
  Intent intent = new Intent(this,MyActivity.class);    
intent.getExtras().putString("id","1");    
startActivity(intent);    
Intent intent = new 
Intent(this,MyActivity.class);intent.getExtras().putString("id","1");
tartActivity(intent);复制代码 第一种方式很明显,直接指定了MyActivity 为接受者,并且传了一些数据给
MyActivity,在MyActivity里可以用getIntent()来的到这个 intent 和数据。  
     
第二种就需要先看一下AndroidMenifest中的 intentfilter的配置了 
    Xml代码 
  <intent-filter>      
<action android:name="android.intent.action.VIEW" />   
<action android:value="android.intent.action.EDIT" />    
<action android:value="android.intent.action.PICK" />       
<category android:name="android.intent.category.DEFAULT"/>    
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />   
</intent-filter>   
   
<intent-filter>       
<action android:name="android.intent.action.VIEW"/>       
<action android:value="android.intent.action.EDIT" />       
<action android:value="android.intent.action.PICK" />       
<category android:name="android.intent.category.DEFAULT" />       
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" /> 
</intent-filter> 
这里面配置用到了action, data, category 这些东西,那么聪明的你一定想到
intent里也会有这些东西,然后一匹配不就找到接收者了吗? 
  action其实就是一个意图的字符串名称。 
  上 面这段intent-filter的配置文件说明了这个Activity可以接受不同的 
Action,当然相应的程序逻辑也不一样咯,提一下那个 mimeType,他是在ContentProvider里定义的,你要是自己实现一个ContentProvider 就知道了,
必须指定 mimeType才能让数据被别人使用。 
     
不知道原理说明白没,总结一句,就是你调用别的界面不是直接 new那个界面,
而是通过扔出一个intent,让系统帮你去调用那个界面,这样就多么松藕合啊,
而且符合了生命周期被系统管理的原则。 
  想知道category都有啥,Android为你预先定制好的action都有啥等等,请
亲自访问官方链接Intent 
  ps:想知道怎么调用系统应用程序的同学,可以仔细看一下你的logcat,每次
运行一个程序的时候是不是有一些信息比如: 
   
Starting activity: Intent 
{action=android.intent.action.MAINcategories={android.intent.category
.LAUNCHER}flags=0x10200000comp={com.android.camera/com.android.camera
.GalleryPicker} } 
  再对照一下Intent的一些set方法,就知道怎么调用咯,希望你喜欢:) 
     
一,listview你是怎么优化的。 
二,view的刷新,之前说过 
三,IPC及原理 
四,Android多线程 
五,Android为什么要设计 4大组件,他们之间的联系,不设计行不行(主要是
为了实现MVC模式,然而java中最难的模式也是这个,很少有产品能将这个模
式做得很好【Technicolor的面试官问的这个】) 
六,service的周期,activity的周期,谈下你对Android内部应用的了解,比
如他做电话,以及联系人等等应用。框架层有很多东西还是多看看,熟悉 Android
怎么做的,不管你做应用程开发还是应用框架层开发很有好处的。 
   在就是你项目经验,突出你遇到什么难点,然后是怎么解决的!尽量将每个技术
点凸显出来,当然面试官有时候会为了体现你是否真正做过,他会问你,你在这
个应用中做那个模块,用了多少个类之类的问题。 
   
偶尔有的面试官会问你,你用过Android自带的单元测试了没,怎么用的? 
   
当然我面试过很多家单位,有的是做平板,手机,数字电视,有的是做出个 erp
之类的客户端等等,出于前面的三个,基本上都是将 Android的全部改掉,如果
真正要做Android的话,大家要学的还很多。 
     
总 之,一句话,什么样的面试官都有,去面试的时候要做好一切心理准备,不
管是技术还是基础都得扎实。一个人的交谈能力也很重要,总之不是非常标准的
普通话, 最起码你说的得让别人听得懂,而且得把面试官讲得非常彻底,这样
你获得offer的机会更大,谈工资也有优势~~当然曾经一家公司的面试官跟我说
过,技术 是不惜钱的,只要你有能力,多少钱他都请。 
    1.View如何刷新? 
  2.DDMS与TraceView的区别? 
  3.activity被回收了怎么办? 
  4.在Java中如何引入 C语言? 
   
参考答案 : 
  1.View 可以调用invalidate()和postInvalidate()这两个方法刷新 
  2.DDMS是一个程序执行查看器,在里面你可以看见线程和堆栈等信息,
TraceView是程序性能分析器 
  3.activity回收了,那就只有另起了 
  4.java调用C语言程序,可以用JNI接口来实现 
  上面答案仅作参考,毕竟我个人能力也有限嘛,难免会回答错误,呵呵..... 
解答:   1.View受系统刷新(系统内部有个循环,监控事件、做业务处理、绘UI),
可以用postInvalidate()促使系统刷新。 
  2.(还真不知道) 
  3.请参照Activity生命周期,如果被系统destroy了,也就是说的回收,只
有从新start了 
  4.通过JNI调用。建议阅读《The Java Native InterfaceProgrammer's Guide 
and Specification》,英文版的,从sun网站下吧。 
 

 

好吧,问的有点偏题了。

其实总结下:

  1.如果你可能刚毕业,接触Android大半年或是培训过,有几个好不错的demo项目并且能理清里面的思路,要的4-6千水平的薪资,你是个踏实的人。对于面试,能知道大部分的基础知识,了解一个项目的流程,并且有上进心,那就很不错了。你知道自己能干什么,也会知道你还要干什么。因为你不可能把薪水局限在这么点吧。

  2.如果你有1年上未满两年Android开发经验。至少你跟团队完成1-2款成熟的商业项目,熟悉这个项目流程,至少参与30%以上编码。完全熟悉网络协议和处理。实现多种自定义的控件等,那么你要个8-10k上下的薪资,过年过节发个奖金,也算是个性情中人。对于面试时,你基本可以直接和面试官交流你的项目的过程和成果,你自己对项目的改进优化的看法,用的觉得自己比较出彩的技术,以及那些难点或是顽固性bug的解决。

  3.这第三条其实不太好总结了。因为没见过,或是没法定位。熟悉多平台开发。3年以上工作经验,1年ios,2以上年的Android。基本开的要求都在1.5-2w了。仅是开工资的这其实也不算太高,因为如果你真有这方面多平台开发经验,我想,你不仅仅只是个开发工程师的角色了。走技术还是产品,也是个人爱好了。参与过几个平台至少1款商业项目的整体开发,当然如果是独立开发过,那就更加出色了。因为这比纯粹的拿到一个半成品的项目增加或是修改来的难度高多了。然后或是有线上的app应用,无论下载量如何,至少你开始有自己的想法了。

并且这样水品的人除了工资要求,可能还会考虑其他的福利问题。那面试中问到的问题就多了。

  4.这边突然发现中间断了一层。一般市场开1-1.5w的开发人员。那么这部分可能已经可以担任一个中小级项目的项目经理了,至少他应该独立完成过一款产品(不包含视觉,交互,美工设计)。那么就可以问下对于应用优化,有利于团队协作管理的方面的问题。版本控制,自动打包测试。也就是上面我简单总结的几方面的问题。

本人其实也不懂,只不过有这方面的人来面试,我觉得吧,总的问几个别太二逼的问题吧。并且意义性比较大。顺便也能提高下自己。

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页