yorki吧 关注:4贴子:142
  • 2回复贴,共1

Android面试题知识积累

只看楼主收藏回复



IP属地:辽宁1楼2016-05-04 17:37回复
    前台进程:目前正在屏幕上显示的进程和一些系统进程。举例来说,Dialer Storage,Google Search等系统进程就是前台进程;再举例来说,当你运行一个程序,如浏览器,当浏览器界面在前台显示时,浏览器属于前台进程(foreground),但一旦你按home回到主界面,浏览器就变成了后台程序(background)。
    后台进程:就是我们通常意义上理解的启动后被切换到后台的进程,如浏览器,阅读器等。当程序显示在屏幕上时,他所运行的进程即为前台进程(foreground),一旦我们按home返回主界面(注意是按home,不是按back),程序就驻留在后台,成为后台进程(background)。后台进程的管理策略有多种:有较为积极的方式,一旦程序到达后台立即终止,这种方式会提高程序的运行速度,但无法加速程序的再次启动;也有较消极的方式,尽可能多的保留后台程序,虽然可能会影响到单个程序的运行速度,但在再次启动已启动的程序时,速度会有所提升。这里就需要用户根据自己的使用习惯找到一个平衡点。
    可见进程:可见进程是一些不在前台,但用户依然可见的进程,举个例来说:widget、输入法等,都属于visible。这部分进程虽然不在前台,但与我们的使用也密切相关,我们也不希望它们被终止(你肯定不希望时钟、天气,新闻等widget被终止,那它们将无法同步,你也不希望输入法被终止,否则你每次输入时都需要重新启动输入法)。
    次要服务:目前正在运行的一些服务(主要服务,如拨号等,是不可能被进程管理终止的,故这里只谈次要服务),举例来说:谷歌企业套件,Gmail内部存储,联系人内部存储等。这部分服务虽然属于次要服务,但很一些系统功能依然息息相关,我们时常需要用到它们,所以也太希望他们被终止。
    内容供应节点:没有程序实体,仅仅提供内容供别的程序去用的,比如日历供应节点,邮件供应节点等。在终止进程时,这类程序应该有较高的优先权。
    空进程:没有任何东西在内运行的进程,有些程序,比如BTE,在程序退出后,依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行,作用往往是提高该程序下次的启动速度或者记录程序的一些历史信息。这部分进程无疑是应该最先终止的。


    IP属地:辽宁3楼2016-05-04 17:54
    回复
      2.Android的消息机制
      Handler是Android消息机制的上层接口,这使得在开发过程中只需要和Handler交互即可.Handler的使用过程很简单,通过它可以轻松的将一个任务切换到Handler所在的线程中去执行.很多人认为Handler的作用是更新UI,这不假,但是更新UI仅仅是handler的一个特殊的使用场景.有时候需要在子线程中进行一些耗时的I/O操作,可能是读取文件或者访问网络等等,我们知道,在子线程中是不能访问UI控件的,那么这个时候我们可以通过Handler将更新UI的操作切换到主线程中执行.
      Android的消息体制主要是指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑.MessageQueue意思是消息队列,他的内部存储了一组消息,以队列的形式对外提供插入和删除的工作.虽然叫消息队列,但他的内部存储结构采用了单链表的数据结构来存储消息队列.Looper意思是消息循环.MessageQueue的功能是用来存储消息的,它并不能处理消息,而Looper刚好填补了这个功能,Looper会以无限循环的形式去查找是否有新消息,如果有的话就处理消息,否则就一直等待.Looper还有一个特殊的概念,那就是ThreadLocal,ThreadLocal并不是线程,它的作用是可以在每个线程中存储数据.Handler创建的时候回采用当前线程的Looper来构造消息循环系统.通过ThreadLocal可以在不同的线程中互不干扰的存储并提供数据,轻松的获取每个线程的Looper.需要注意的是,线程是默认没有Looper的,如果需要使用Handler就必须为线程创建Looper.主线程也叫UI线程,他就是ActivityThread.ActivityThread被创建时就会初始化Looper,这也是在主线程中默认可以使用Handler的原因.


      IP属地:辽宁4楼2016-05-05 21:24
      回复