• Android面试题(一)


    1、 Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念

    DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。

    2、 android中的动画有哪几类,它们的特点和区别是什么

    两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。

    3、handler机制的原理

    andriod提供了 Handler  Looper 来满足线程间的通信。Handler 先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)

    1Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)

    2Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收LooperMessage Queue取出)所送来的消息。

    3 Message Queue(消息队列):用来存放线程放入的消息。

    4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue

    8、说说mvc模式的原理,它在android中的运用

    MVC(Model_view_contraller)”模型_视图_控制器。 MVC应用程序总是由这三个部分组成。Event(事件)导致Controller改变ModelView,或者同时改变两者。只要 Controller改变了Models的数据或者属性,所有依赖的View都会自动更新。类似的,只要Controller改变了ViewView会 从潜在的Model中获取数据来刷新自己。

    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的基本生命周期如下代码 所示: 

    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();  
      }   

    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]来处理多线程和界面交互的问题。这个我后面会讲一些,最近因为这些东西头已经很大了,等我理清思绪再跟大家分享。 


  • 相关阅读:
    设计模式与23种设计模式的简单介绍
    一文读懂C++ Vector在算法竞赛中的常见用法
    一文读懂C++ String类在算法竞赛中的常见用法
    GO语言的单元测试与性能测试
    变量提升和函数提升及二者优先级
    闭包
    读《你不知道的JavaScript 中》-异步【3】Promise
    js数组方法-改变原数组和不改变原数组
    读《你不知道的JavaScript 中》-异步【2】回调
    组合类算法问题
  • 原文地址:https://www.cnblogs.com/liuzenglong/p/2221008.html
Copyright © 2020-2023  润新知