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的步驟:
- 自定義View的屬性;
編寫attr文件
- 在View的構造方法中獲得自定義的屬性;
- 重寫onMeasure(); --> 並不是必須的,大部分的時候還需要覆寫
- 重寫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進行處理。從而實現線程之間的通信。