android面试不得不喝的鸡汤
———作为万千android求职菜鸟的小石头,参考了诸多文章,找到了一些android面试问到的一些常见问题,在此我做了一下总结,肯定有疏漏或对android知识理解的不到位的地方,希望各种大神和小神们能给个评论,我会做进一步的修改和补充。下面就是我见到的问题。
activity、 view 、 windows的区别和联系
LaunchMode 的使用场景
view 的绘制流程
*Touch事件分发机制
Android动画的原理
对Handler ,looper,MessageQueue 的理解
android跨进程通讯的方式
Binder的理解
process(进程) and thread(线程)
Android Mashup的设计方式的理解
—–接下来我对以上相关问题做了自己的答案,真心的希望广大高手能给出意见和建议,让我的这份答卷能答60分。
activity、 view 、 windows的区别和联系
——–Activity 可以说是应用程序的载体(也可以理解为界面的载体,但是不界面),用户能够在上面绘制界面(Activity本身不绘制界面),并提供用户处理事件的API,维护应用程序的生命周期(Android应用程序是由多个 Activity 堆积而成,而各个 Activity 又有其独立的生命周期)。负责绘制界面的工作是由windows来处理的。view自然就是我们经常用到的button 、textview、imageview.、layout..的控件和布局了。
该文章解释的比较好,链接为:activity、window、 view的联系
LaunchMode 的使用场景
——–Activity的启动模式launchMode包括:standard模式、 singleTop模式 singleTask模式 、singleInstance模式。standard模式是默认的模式,singleInstance模式不常用到,就不在做说明。
——–singleTop模式 :如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例。
——–singleTask模式:如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
下面我们总结一下使用场景:
singleTop适合接收通知启动的内容显示页面。
例如,某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。
singleTask适合作为程序入口点。
例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。
singleInstance适合需要与程序分离开的页面。
例如闹铃提醒,将闹铃提醒与闹铃设置分离。
singleInstance不要用于中间页面,如果用于中间页面, 跳转会有问题 ,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。
——–文章链接:LaunchMode的使用场景
view 的绘制流程
——–view的绘制经过一下几个方法:Measure、Layout、Draw具体的绘制流程请大家自行总结,多多练习。该链接就讲解的非常好:view的绘制流程
4、Touch事件分发机制
android对Touch Event的分发逻辑是View从上层分发到下层(dispatchTouchEvent函数)类似于隧道方式,然后下层优先开始处理Event(先 mOnTouchListener,再onTouchEvent)并向上返回处理情况(boolean值),若返回true,则上层不再处理。类似于冒泡 方式 ,对Touch事件分发要是能有较深的了解的,不得不知道以下这3个事件:onInterceptTouchEvent事件、onTouchEvent()事件、dispatchTouchEvent()事件。
dispatchTouchEvent(): 这个方法用来分发TouchEvent
onInterceptTouchEvent():这个方法用来拦截TouchEvent
onTouchEvent():这个方法用来处理TouchEvent
假设一个事件的传递过程为:activity -> ViewGroup1 -> ViewGroup1的直接子ViewGroup –> ×××××× -> 叶子View,默认情况,一个消息最后只需要一个人处理,其它消息途径者都只是干了中转的效果,消息传递途径的三级处理机制:①接受上级消息(dispatchTouchEvent)②决策向下级分发还是自身处理(onInterceptTouchEvent)③自身处理逻辑(onTouchEvent、onTouch 、onClick 、onLongClick 等)
———-OnTouchListener onTouch onTouchEvent 的区别:
首先执行OnTouchListener()中的onTouch,然后执行重写的onTouchEvent(MotionEvent event)。(注:在return不为true的情况下)
onTouch() is used by users of the View to get touch events while onTouchEvent() is used by derived classes of the View to get touch events.
消息处理中, return true 表示消息被完整地处理完成了,后面不用再用其他事件处理了。
———-解释的比较好的网址链接为:touch事件的分发机制
5、Android动画的原理
Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换 ( 平移、缩放、旋转 ) 产生动画效果;第二类是 Frame 动画,即顺序播放事先做好的图像,类似幻灯片。代码实现的例子为:
Animation anim=null;
anim=new RotateAnimation(0.0f,+360.0f);
anim.setInterpolator(new AccelerateDecelerateInterpolator());
anim.setDuration(3000);
findViewById(R.id.TextView01).startAnimation(anim);
android动画的原理好复杂的样子,具体的链接网址为android动画原理
6、对Handler ,looper,MessageQueue 的理解
——–Handler 的作用:发送消息和处理消息,handler发送的消息必须发送到指定的MessageQueue,而MessageQueue是由Looper负责管理的,也就是说当前线程必须有一个Looper对象。在Looper的构造方法中包含MessageQueue的建立。
保证当前线程中有Looper对象有两种方法:
在主UI线程中,系统初始化了一个Looper对象,因此直接创建Handler即可;
在子线程中,需要自己创建一个Looper对象,并且启动它 Looper.prepare()方法 和 Looper.loop()方法。
——–感觉足够了,以上也是我从疯狂android讲义中提取到的,简单明了。如果有想了解更详细的解释,请多多练习,这里是比较详细的链接网址:handler looper 的理解
7、android跨进程通讯的方式
———activity可以跨进程调用其他应用程序的Activity;Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形式返回),当然,也可以对其他应用程序的数据进行增、删、改操 作;Broadcast可以向android系统中所有应用程序发送广播,而需要跨进程通讯的应用程序可以监听这些广播;Service和Content Provider类似,也可以访问其他应用程序中的数据,但不同的是,Content Provider返回的是Cursor对象,而Service返回的是Java对象,这种可以跨进程通讯的服务叫AIDL服务。该文章解释的就很不错,android跨进程通讯的4中方式
8、Binder的理解
直接给链接吧,bander就知道service里用到了IBander,Binner的理解
19、process(进程) and thread(线程)
默认情况下,同一个应用程序内的所有组件都是运行在同一个进程中的,大部分应用程序也不会去改变它,也就是说一个应用的开启对应一个进程,而一个Thread可以看做是该进程中的一个实例。对于特殊需求的应用需要开启多个进程。线程就是我们在开发中经常用到的UI线程和new 出来的子线程。对于进程的重要级别,进程间的通讯,请查看api官网:process和thread官方文档介绍
10、Android Mashup的设计方式的理解*
谁知道能留个言,求介绍比较好的文章学习下,日后必有重谢。