Android 基本面試題


Android 基本面試題




一、java 核心思想

1、八種基本數據類型和封裝類

基本類型 大小(字節)
byte 1
short 2
int 4
long 8
float 4
double 8
boolean 1bit
char 2

2、 Switch能否用string做參數?

在 Java 7之前,switch 只能支持 byte、short、char、int或者其對應的封裝類以及 Enum 類型。在 Java 7中,String支持被加上了。

3、設計模式

工廠方法模式

interface food{}

class A implements food{}
class B implements food{}
class C implements food{}

public class StaticFactory {

    private StaticFactory(){}
    
    public static food getA(){  return new A(); }
    public static food getB(){  return new B(); }
    public static food getC(){  return new C(); }
}

class Client{
    //客戶端代碼只需要將相應的參數傳入即可得到對象
    //用戶不需要了解工廠類內部的邏輯。
    public void get(String name){
        food x = null ;
        if ( name.equals("A")) {
            x = StaticFactory.getA();
        }else if ( name.equals("B")){
            x = StaticFactory.getB();
        }else {
            x = StaticFactory.getC();
        }
    }
}

單例模式

public class Singleton {
    private Singleton(){}

    private static class SingletonBuild{
        private static Singleton value = new Singleton();
    }

    public Singleton getInstance(){  return  SingletonBuild.value ;}
    
}

builder模式

public class Builder {

    static class Student{
        String name = null ;
        int number = -1 ;
        String sex = null ;
        int age = -1 ;
        String school = null ;

     //構建器,利用構建器作為參數來構建Student對象
        static class StudentBuilder{
            String name = null ;
            int number = -1 ;
            String sex = null ;
            int age = -1 ;
            String school = null ;
            public StudentBuilder setName(String name) {
                this.name = name;
                return  this ;
            }

            public StudentBuilder setNumber(int number) {
                this.number = number;
                return  this ;
            }

            public StudentBuilder setSex(String sex) {
                this.sex = sex;
                return  this ;
            }

            public StudentBuilder setAge(int age) {
                this.age = age;
                return  this ;
            }

            public StudentBuilder setSchool(String school) {
                this.school = school;
                return  this ;
            }
            public Student build() {
                return new Student(this);
            }
        }

        public Student(StudentBuilder builder){
            this.age = builder.age;
            this.name = builder.name;
            this.number = builder.number;
            this.school = builder.school ;
            this.sex = builder.sex ;
        }
    }

    public static void main( String[] args ){
        Student a = new Student.StudentBuilder().setAge(13).setName("LiHua").build();
        Student b = new Student.StudentBuilder().setSchool("sc").setSex("Male").setName("ZhangSan").build();
    }
}

二、Android 基本知識

1、自定義view

View在Activity中顯示出來


,要經歷測量、布局和繪制三個步驟

(1)測量:onMeasure()決定View的大小;

(2)布局:onLayout()決定View在ViewGroup中的位置;

(3)繪制:onDraw()決定繪制這個View。

自定義View的步驟:

  1. 自定義View的屬性;編寫attr文件
  2. 在View的構造方法中獲得自定義的屬性;
  3. 重寫onMeasure(); --> 並不是必須的,大部分的時候還需要覆寫
  4. 重寫onDraw();

2、Activity的生命周期與啟動模式

生命周期

啟動模式

(1)standard:標准模式,每次啟動一個Activity都會重新建一個新的實例,不管這個實例是否已經存在。

(2)singleTop:棧頂復用模式,如果新Activity已經位於任務站的棧頂,那么次Activity不會被重新創建,同時它的onNewIntent方法會被調用,通過此方法的參數我們可以去取當前請求的信息。

(3)singleTask:棧內復用模式,這是一種單實例模式,在這種模式下,只要Activity在一個棧中存在,那么多次啟動此Activity都不會重新創建實例,和singleTop一樣,系統也會調用其onNewIntent

(4)singleIntance:單實例模式,一種加強的singleTask模式,除了具有singleTask模式的所有特性,還具有此種模式的Activity只能單獨地位於任務棧中,由於棧內復用的特性,后續的請求均不會創建新的Activity,除非這個任務棧被系統銷毀

3、Android中常用的五種布局

常用五種布局方式,分別是:FrameLayout(框架布局),LinearLayout (線性布局),AbsoluteLayout(絕對布局),RelativeLayout(相對布局),TableLayout(表格布局)。

4、內存優化

產生原因

(1)靜態變量

(2)非靜態內部類

(3)Handler ——>弱引用解決

 private static class MyHandler extends Handler {

   private WeakReference<MainActivityactivityWeakReference;

   public MyHandler(MainActivity activity) {
      activityWeakReference = new WeakReference<>(activity);
   }
    
   @Override
    public void handleMessage(Message msg) {
        MainActivity activity = activityWeakReference.get();
        if (activity != null) {
            if (msg.what == 1) {
                // 做相應邏輯
            }
        }
    }
}

5、事件分發機制

6、Activity啟動過程

當我們點擊應用圖標的時候,就會調用startActivitySately()方法,而這個方法內部則是調用startActivty(),而startActivity()方法最終還是會調用startActivityForResult()這個方法。而在startActivityForResult()這個方法。因為startActivityForResult()方法是有返回結果的,所以系統就直接給一個-1,就表示不需要結果返回了。而startActivityForResult()這個方法實際是通過Instrumentation類中的execStartActivity()方法來啟動activity,Instrumentation這個類主要作用就是監控程序和系統之間的交互。而在這個execStartActivity()方法中會獲取ActivityManagerService的代理對象,通過這個代理對象進行啟動activity。啟動會就會調用一個checkStartActivityResult()方法,如果說沒有在配置清單中配置有這個組件,就會在這個方法中拋出異常了。當然最后是調用的是Application.scheduleLaunchActivity()進行啟動activity,而這個方法中通過獲取得到一個ActivityClientRecord對象,而這個ActivityClientRecord通過handler來進行消息的發送,系統內部會將每一個activity組件使用ActivityClientRecord對象來進行描述,而ActivityClientRecord對象中保存有一個LoaderApk對象,通過這個對象調用handleLaunchActivity來啟動activity組件,而頁面的生命周期方法也就是在這個方法中進行調用。

7、保存Activity狀態

onSaveInstanceState(Bundle)會在activity轉入后台狀態之前被調用,也就是onStop()方法之前,onPause方法之后被調用;

8、Handler的原理

Android中主線程是不能進行耗時操作的,子線程是不能進行更新UI的。所以就有了handler,它的作用就是實現線程之間的通信。

handler整個流程中,主要有四個對象,handler,Message,MessageQueue,Looper。當應用創建的時候,就會在主線程中創建handler對象,

我們通過要傳送的消息保存到Message中,handler通過調用sendMessage方法將Message發送到MessageQueue中,Looper對象就會不斷的調用loop()方法

不斷的從MessageQueue中取出Message交給handler進行處理。從而實現線程之間的通信。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM