Android试题(二)

  • 获取屏幕属性:

      获取屏幕密度  getScreen
      获取设备屏幕大小 getDisplay
      获得屏幕的属性,从而取得屏幕的高度和宽度 getMetrics
      获得window对象 getWindows
    
  • Activity的启动模式:

      Android5.0之前,当启动一个Activity时,系统将首先检查Activity的launchMode,如果为A页面设置为SingleInstance或者B页面设置为singleTask或者singleInstance,则会在LaunchFlags中加入FLAG_ACTIVITY_NEW_TASK标志,而如果含有FLAG_ACTIVITY_NEW_TASK标志的话,onActivityResult将会立即接收到一个cancel的信息。 
      在Android5.0做出来修改,系统即便启动的页面设置launchMode为singleTask或singleInstance,onActivityResult依旧可以正常工作。
    
  • AlertDialog:

    AlertDialog是protected声明的,所以不能使用new来创建新的对象,需要使用Builder方法来帮助创建

      AlertDialog.Builder db= new Builder(this);
      db.create().show();
    

    ProcessDialog是public声明的,所以可以直接用new来创建新的对象

      ProgressDialog pDialog;//进度条对话框对象 
      pDialog = new ProgressDialog(Context); 
    
  • java文件中,public声明的类必须要和文件名同名,而内部类和非public类可以是任意的名字

  • int + String = String

  • java中类是单继承(只能有一个父亲),但接口可以多继承

  • HashMap和HashTable的异同:

      二者均是实现的Map接口,都以键值对的形式保存
      HashTable不允许有null, HashMap允许出现null
      HashTable的方法是Synchronize的,HashMap则不是,在多线程访问时需要提供同步
    
  • Java程序初始化的执行顺序:

      父类静态变量—>父类静态代码块—>
      子类静态变量—>子类静态代码块—>
      父类非静态变量—>父类非静态代码块—>父类构造方法—>
      子类非静态变量—>子类非静态代码块—>子类构造方法
    
      class A {
    	  public A() {
         	 System.out.println("class A");
     	  }
      	  { System.out.println("I'm A class"); } 
     	  static { System.out.println("class A static"); }
      }
      public class B extends A {
      	public B() {
       	   System.out.println("class B");
        }
      	{ System.out.println("I'm B class"); }
    	static { System.out.println("class B static");
      }
       
      public static void main(String[] args) { 
      	new B(); 
      }
    
    
      class A static        
      class B static           
      I'm A class             
      class A               
      I'm B class 
      class B
    
  • JVM内存堆溢出:

    1. JVM堆内存氛围两块:PermanentSpace(持久区)和HeapSpace(堆),前者主要用来存放Java类定义信息,和垃圾收集器要收集的Java对象关系不大,后者内部也有两部分组成分别是:New Generation和Old generation即新生代和年老代。

    2. new中分成三个区(Eden, Survivor, Survivor),新生的对象先进入Eden中,当Eden满了就把还存活的对象放入入第一个Survicor(from),当第一个Survivor满了则将此区还存活的对象放入第二个Survivor中(to),当第二个Survivor也满了的时候就将此区还存活的对象放入Old Generation中。

    3. 针对新生代的垃圾清理叫做YoungGC
      针对年老代的垃圾清理叫做FullGC
      所以年老代内存储的都是一些经历了许多次GC后仍然存活的对象,也就是生命周期都比较长

    4. 年老代溢出原因有 循环上万次的字符串处理、创建上千万个对象、在一段代码内申请上百M甚至上G的内存,
      持久代溢出原因 动态加载了大量Java类而导致溢出

    5. 申请内存的过程:
      JVM会试图为相关Java对象在年轻代的Eden区中初始化一块内存区域。
      当Eden区空间足够时,内存申请结束。否则执行下一步。
      JVM试图释放在Eden区中所有不活跃的对象(Young GC)。释放后若Eden空间仍然不足以放入新对象,JVM则试图将部分Eden区中活跃对象放入Survivor区。
      Survivor区被用来作为Eden区及年老代的中间交换区域。当年老代空间足够时,Survivor区中存活了一定次数的对象会被移到年老代。
      当年老代空间不够时,JVM会在年老代进行完全的垃圾回收(Full GC)。
      FullGC后,若Survivor区及年老代仍然无法存放从Eden区复制过来的对象,则会导致JVM无法在Eden区为新生成的对象申请内存,即出现“Out of Memory”。

Android试题(二)_第1张图片

你可能感兴趣的:(Android)