知識

Java

Java三大特性詳解

指的是封裝捐川,繼承菩暗,多態(tài)
封裝:指的是屬性私有化彪标,根據(jù)需要提供setter和getter方法來訪問屬性。即隱藏具體屬性和實現(xiàn)細(xì)節(jié),僅對外開放接口,控制程序中屬性的訪問級別。
目的:增強安全性和簡化編程

繼承:是指將多個相同的屬性和方法提取出來杖刷,新建一個父類用來繼承。目的:代碼復(fù)用驳癌。

多態(tài)可以分為兩種:設(shè)計時多態(tài)和運行時多態(tài)滑燃。
設(shè)計時多態(tài):即重載(Overload),是指Java允許方法名相同而參數(shù)不同(返回值可以相同也可以不相同)颓鲜。
運行時多態(tài):即重寫(Override)不瓶,是指Java運行根據(jù)調(diào)用該方法的類型決定調(diào)用哪個方法。
目的:增加代碼的靈活度灾杰。

String,StringBuffer,StringBuilder的區(qū)別

StringBuffer:線程安全
StringBuilder:線程不安全蚊丐。
當(dāng)多個線程同步操作數(shù)據(jù),使用StringBuffer
因為 StringBuffer 的所有公開方法都是 synchronized 修飾的艳吠,而 StringBuilder 并沒有修飾麦备。

String的值是不可變的,這就導(dǎo)致每次對String的操作都會生成新的String對象昭娩,不僅效率低下凛篙,而且浪費大量優(yōu)先的內(nèi)存空間

StringBuilder執(zhí)行效率高于StringBuffer,更快栏渺,但是不安全
當(dāng)字符賦值少使用String
字符賦值頻繁使用StringBuilder
多個線程同步操作數(shù)據(jù)呛梆,使用StringBuffer

Java中==,equal和hashCode的區(qū)別

首先equals和==最大的區(qū)別是一個是方法一個是運算符磕诊,==比較的是地址,equals比較的是值
== :該操作符生成的是一個boolean結(jié)果填物,比較的是對象的地址
equals方法本意是用來判斷引用的對象是否一致纹腌,比較的是對象的內(nèi)容或者值
hashcode是系統(tǒng)用來快速檢索對象而使用
hashCode()方法和equals()方法的作用其實一樣,在Java里都是用來對比兩個對象是否相等一致滞磺。
重寫equals方法升薯,必須也要重寫hashCode方法
兩個對象 equals 相等,那他們 hashCode 一定也相等
兩個對象 hashCode 相等击困,那他們 equals 不一定相等
hashCode()進(jìn)行對比涎劈,則只要生成一個hash值進(jìn)行比較就可以了,效率高

String 屬于基礎(chǔ)的數(shù)據(jù)類型嗎阅茶?

    String 不屬于基礎(chǔ)類型蛛枚,基礎(chǔ)類型有 8 種:byte、boolean脸哀、char蹦浦、short、int企蹭、float白筹、long智末、double谅摄,而 String 屬于對象。

final 在 java 中有什么作用系馆?

final 修飾的類叫最終類送漠,該類不能被繼承。
final 修飾的方法不能被重寫由蘑。
final 修飾的變量叫常量闽寡,常量必須初始化,初始化之后值就不能被修改尼酿。
static和final的意義是不同的爷狈,
static修飾的時候代表對象是靜態(tài)的,而final修飾的時候代表對象只能賦值一次裳擎,
他們連用的時候是因為定義的那個對象既要它是靜態(tài)的涎永,也要求它的值不能再被修改。
當(dāng)修飾一個類方法時候你就可以直接通過類來調(diào)用而不需要新建對象鹿响。

接口和抽象類有什么區(qū)別羡微?

實現(xiàn):抽象類的子類使用 extends 來繼承;接口必須使用 implements 來實現(xiàn)接口惶我。
構(gòu)造函數(shù):抽象類可以有構(gòu)造函數(shù)妈倔;接口不能有。
main 方法:抽象類可以有 main 方法绸贡,并且我們能運行它盯蝴;接口不能有 main 方法毅哗。
實現(xiàn)數(shù)量:類可以實現(xiàn)很多個接口;但是只能繼承一個抽象類结洼。
訪問修飾符:接口中的方法默認(rèn)使用 public 修飾黎做;抽象類中的方法可以是任意訪問修飾符。
抽象類是對類抽象松忍,而接口是對行為的抽象蒸殿。
與抽象類相比,接口性能較慢鸣峭。
JAVA8 增加宏所,在接口中被default標(biāo)記的方法為普通方法,可以直接寫方法體摊溶。
java接口可以被繼承爬骤,而且是多繼承,但是只能是接口繼承接口莫换,類只能實現(xiàn)接口霞玄。
一個接口可以繼承另一個接口或多個,一個普通類可以實現(xiàn)多個接口拉岁,抽象類也可以實現(xiàn)多個接口
接口不可實現(xiàn)接口坷剧,只能繼承接口
如果一個類里有抽象方法,那么這個類只能是抽象類

Java線程和多線程和線程池

Java創(chuàng)建線程主要有三種方式喊暖,分別為:繼承Thread類創(chuàng)建線程類;通過Runnable接口創(chuàng)建線程類;通過Callable和Future創(chuàng)建線程和使用線程池惫企。
Java線程共有5中狀態(tài),分別為:新建(new)陵叽、就緒(runnable)狞尔、運行(running)、堵塞(blocked)巩掺、死亡(dead)
同步的實現(xiàn)方面有兩種偏序,分別是synchronized,wait與notify
volatile不會造成線程的阻塞;synchronized可能會造成線程的阻塞胖替。
volatile不能保證線程安全而synchronized可以保證線程安全研儒。
線程是進(jìn)程的子集,一個進(jìn)程可以有很多線程刊殉。一個程序至少一個進(jìn)程殉摔,一個進(jìn)程至少一個線程。
Java線程池有四種记焊,分別為:newSingleThreadExecutor逸月、newCachedThreadPool、newFixedThreadPool遍膜、newScheduleThreadPool碗硬。
線程池是一種多線程處理形式瓤湘,處理過程中將任務(wù)提交到線程池,任務(wù)的執(zhí)行交由線程池來管理恩尾。

java多線程中sleep和wait的4個區(qū)別

1弛说、sleep是線程中的方法,但是wait是Object中的方法翰意。
62木人、sleep方法不會釋放lock,但是wait會釋放冀偶,而且會加入到等待隊列中醒第。
3、sleep方法不依賴于同步器synchronized进鸠,但是wait需要依賴synchronized關(guān)鍵字稠曼。
4、sleep不需要被喚醒(休眠之后推出阻塞)客年,但是wait需要(不指定時間需要被別人中斷)

ThreadLocal是什么

ThreadLocal是線程本地變量的意思霞幅,主要用于多線程對同一個變量的讀寫操作,在多線程環(huán)境下去保證變量的安全量瓜。
執(zhí)行remove避免內(nèi)存泄漏司恳, ThreadLocal 內(nèi)部維護(hù)了一個 Map,Key為弱引用

final finally finalize三個關(guān)鍵字的區(qū)別

final可以修飾類榔至、變量抵赢、方法欺劳,修飾類表示該類不能被繼承唧取、修飾方法表示該方法不能被重寫、修飾變量表示該變量是一個常量不能被重新賦值划提。
finally一般作用在try-catch代碼塊中枫弟,在處理異常的時候,通常我們將一定要執(zhí)行的代碼方法finally代
碼塊中鹏往,表示不管是否出現(xiàn)異常淡诗,該代碼塊都會執(zhí)行,一般用來存放一些關(guān)閉資源的代碼伊履。
finalize是一個方法韩容,屬于Object類的一個方法,而Object類是所有類的父類唐瀑,該方法一般由垃圾回收器來
調(diào)用群凶,當(dāng)我們調(diào)用System的gc()方法的時候,由垃圾回收器調(diào)用finalize(),回收垃圾哄辣。 

Java類加載機制

類的生命周期
包括以下 7 個階段:
加載(Loading)
驗證(Verification)
準(zhǔn)備(Preparation)
解析(Resolution)
初始化(Initialization)
使用(Using)
卸載(Unloading)

淺談String s1 = "abc" 和s2= new String("abc")的區(qū)別

s1==s2->false
s1.equals(s2)->true
String temp = "hello";  // 在常量池中
String str = new String(temp); // 在堆上     這段代碼就創(chuàng)建了2個String對象
String str = "test";以這種方式賦值時请梢,JVM會先從字符串實例池中查詢是否存在"test"這個對象
以這種方式賦值時赠尾,JVM會先從字符串實例池中查詢是否存在"test"這個對象,
若不存在則會在實例池中創(chuàng)建"test"對象毅弧,同時在堆中創(chuàng)建"test"這個對象

Java:強引用气嫁,軟引用,弱引用和虛引用

StrongReference够坐,SoftReference寸宵,WeakReference,PhantomReference
java默認(rèn)就是強引用
目的:第一是可以讓程序員通過代碼的方式?jīng)Q定某些對象的生命周期元咙;第二是有利于JVM進(jìn)行垃圾回收邓馒。
可以避免OOM內(nèi)存溢出,在安卓主要是處理緩存用的多蛾坯,我們可以在確定一個 Bitmap 被回收后光酣,再去申請另外一個 Bitmap 的內(nèi)存

jvm垃圾回收機制

JVM 的主要組成部分 類加載器,棧內(nèi)存,堆內(nèi)存,方法區(qū),程序計數(shù)器,運行數(shù)據(jù)區(qū)
原理:引用計數(shù)法以及可達(dá)性分析算法(標(biāo)記清除,標(biāo)記整理脉课,復(fù)制算法救军,分代算法等等)
需要進(jìn)行回收垃圾的區(qū):堆和方法區(qū)
垃圾回收有兩種類型:Minor GC 和 Full GC

說一下堆棧的區(qū)別?

功能方面:堆是用來存放對象的倘零,棧是用來執(zhí)行程序的唱遭。
共享性:堆是線程共享的,棧是線程私有的呈驶。
空間大锌皆蟆:堆大小遠(yuǎn)遠(yuǎn)大于棧。

集合相關(guān) map list set

image

image
List:繼承Collection接口袖瞻;有序集合司致,允許重復(fù)元素
Set: 繼承Collection接口;無序集合聋迎,不允許重復(fù)元素脂矫,且最多有一個null值。
Map: key_value鍵值對霉晕;不允許重復(fù)元素庭再。

常用的Map集合:HashMap、HashTable牺堰、LinkedHashMap拄轻、ConcurrentHashMap。


HashMap和Hashtable的區(qū)別
HashMap沒有考慮同步,是線程不安全的;Hashtable使用了synchronized關(guān)鍵字,是線程安全的
HashMap允許K/V都為null,后者都不允許為null

ArrayList和Vector的區(qū)別
這兩個類都實現(xiàn)了List接口,都是有序的集合,相當(dāng)于動態(tài)數(shù)組,可以按照位置索引取出元素,數(shù)據(jù)也是允許重復(fù)的
區(qū)別主要包括兩方面:同步性和數(shù)據(jù)增長
Vector是線程安全的,也就是說他的方法之間是線程同步的,加了synchronized關(guān)鍵字,ArrayList則相反
如果是單線程可以選擇ArrayList,多線程則可以選擇Vector
Vector在數(shù)據(jù)滿時,增長為原來的2倍,而ArrayList在數(shù)據(jù)達(dá)到容量一半時,增長為原容量的0.5倍 + 1個空間

ArrayList和LinkedList的區(qū)別
LinkedList實現(xiàn)了List和Deque接口,一般稱為雙向鏈表,ArrayList實現(xiàn)了List接口,動態(tài)數(shù)組
LinkedList在插入和刪除數(shù)據(jù)時效率更高,ArrayList在查找,某個index的數(shù)據(jù)時效率更高
LinkedList比ArrayList需要更多的內(nèi)存

JAVA反射與注解

反射和注解伟葫,并實現(xiàn)的依賴注入
反射機制就是在運行狀態(tài)中恨搓,對于任意一個類,都能夠知道這個類的所有屬性和方法扒俯;對于任意一個對象奶卓,都能夠調(diào)用它的任意一個方法和屬性一疯;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制。
簡單來說反射可以實現(xiàn)在運行時可以知道任意一個類的屬性和方法夺姑。
反射機制主要提供了以下功能:

在運行時判斷任意一個對象所屬的類墩邀;
在運行時構(gòu)造任意一個類的對象;
在運行時判斷任意一個類所具有的成員變量和方法盏浙;
在運行時調(diào)用任意一個對象的方法眉睹;
生成動態(tài)代理(ps:這個知識點也很重要,后續(xù)會為大家講到)

Java 反射機制的應(yīng)用場景

逆向代碼 废膘,例如反編譯
與注解相結(jié)合的框架 例如Retrofit
單純的反射機制應(yīng)用框架 例如EventBus
動態(tài)生成類框架 例如Gson

基本寫法

Class c = Man.class;
Object o = c.newInstance();
Method eat = c.getMethod("eat", String.class);
eat.invoke(o,"小明");

Field name = c.getField("name");
name.get(o);

Java中集合的泛型竹海,是防止錯誤輸入的,只在編譯階段有效丐黄,可以通過反射在泛型為String類型的List里面添加Int類型

注解

什么是注解:

注解也叫元數(shù)據(jù)斋配,是一種應(yīng)用于類、方法灌闺、參數(shù)艰争、變量、構(gòu)造器及包聲明中的特殊修飾符桂对。

注解分為三種:

一類是Java自帶的標(biāo)準(zhǔn)注解甩卓,包括@Override、@Deprecated和@SuppressWarnings
分別用于標(biāo)明重寫某個方法蕉斜、標(biāo)明某個類或方法過時逾柿、標(biāo)明要忽略的警告,用這些注解標(biāo)明后編譯器就會進(jìn)行檢查宅此。

一類為元注解机错,元注解是用于定義注解的注解
@Target
@Retention
@Documented
@Inherited

@Target用于標(biāo)明注解使用的范圍
@Retention用于標(biāo)明注解被保留的階段
@Documented用于標(biāo)明是否生成javadoc文檔。
@Inherited用于標(biāo)明注解可繼承


一類為自定義注解诽凌,可以根據(jù)自己的需求定義注解毡熏,并可用元注解對自定義注解進(jìn)行注解坦敌。

一般用法
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TestAnnotation {
    /**
     * id
     * @return
     */
    public int id() default -1;
    /**
     * name
     * @return
     */
    public String name() default "";
}

注解處理器侣诵。原理就是反射機制。想使用反射去讀取注解狱窘,必須將 Retention的值選為RUNTIME
Class c = Man.class;
Object o = c.newInstance();
Field field = c.getDeclaredField("name");
ManName annotation = field.getAnnotation(ManName.class);
System.out.println(annotation.name());
image

泛型

泛型的主要目標(biāo)是提高 Java 程序的類型安全
泛型就是參數(shù)化類型杜顺,就是一種類型約束,通配符
泛型是通過類型擦除來實現(xiàn)的蘸炸,泛型只在編譯階段有效
泛型分為:泛型類躬络,泛型接口,泛型方法

泛型中通配符

常用的 T搭儒,E穷当,K提茁,V,馁菜?

茴扁?無界通配符 看成所有類型的父類,當(dāng)具體類型不確定汪疮,泛型類不能用無界通配符

上界通配符 < ? extends E> 表示該參數(shù)必須繼承XXX

下界通配符 < ? super E>  表示給參數(shù)為XXX的父對象

峭火?和 T 的區(qū)別

T和?運用的地方有點不同,?是定義在引用變量上,T是類上或方法上(當(dāng)變量指向一個對象時智嚷,這個變量就被稱為引用變量)

泛型類卖丸,泛型接口,泛型方法

泛型方法的聲明必須要在public <T> void fangfa(T t);其中<T> 表示聲明這個方法為泛型方法
有泛型方法的類不一定是泛型類,注意泛型方法里的T可以和當(dāng)前泛型類的T不一樣盏道,是一種新的類型

Java泛型實現(xiàn)原理:類型擦出

Java中的泛型基本上都是在編譯器這個層次來實現(xiàn)的稍浆。在生成的Java字節(jié)碼中是不包含泛型中的類型信的。
使用泛型的時候加上的類型參數(shù)猜嘱,會在編譯器在編譯的時候去掉粹湃。這個過程就稱為類型擦除。  

設(shè)計模式

Android常用設(shè)計模式:

單例模式泉坐;
    例:Gson,Utils,EventBus,工具類
    餓漢为鳄,懶漢,懶漢雙重加鎖腕让,靜態(tài)內(nèi)部類(懶加載孤钦,線程安全)
Build模式(建造者模式);
    例:AlertDialog纯丸,Glide偏形,Picasso,Retrofit觉鼻,鏈?zhǔn)秸{(diào)用
    變種Builder模式和普通寫法俊扭,變種就是靜態(tài)內(nèi)部類,鏈?zhǔn)秸{(diào)用
    隔離復(fù)雜對象的創(chuàng)建和使用坠陈,并使得相同的創(chuàng)建過程可以創(chuàng)建不同的產(chǎn)品
觀察者模式萨惑;
    例:廣播、EventBus仇矾、RxJava,Listener,RecyclerView中的ui更新(notifyDataSetChanged)
    定義一個被觀察者和多個觀察者庸蔼,每當(dāng)被觀察者變化,所有觀察者都會得到通知贮匕。
    核心:用一個list把觀察者保存起來姐仅,并提供add和remove觀察者,在被觀察者變化的時候就遍歷并調(diào)用list里觀察者的方法。核心就是一個list遍歷
    一般是通過接口回調(diào)的方式通知觀察者(小明取快遞)
適配器模式掏膏;
    例:FragMentAdapter,RecycleAdapter,ListAdapter
    適配器模式有三種:類適配器(繼承)劳翰,對象適配器(持有引用),接口適配器(實現(xiàn)兩個接口).
    適配方式有兩種:繼承和構(gòu)造傳遞(持有引用),成龍翻譯
    通過適配器連接不同的接口馒疹,適配器模式把一個類的接口變換成另一種適配接口磕道,從而使原本因為接口不匹配而無法在一起工作的兩個類能夠在一起工作。
代理模式行冰;
    分為靜態(tài)代理和動態(tài)代理
    靜態(tài)代理主要是通過構(gòu)造對象(持有引用) 動態(tài)代理則是通過反射實現(xiàn)的
    動態(tài)代理實現(xiàn)的是JDK提供的接口InvocationHandler調(diào)用invoke方法實現(xiàn)
工廠模式溺蕉;
    例:FragmentFactory,第三方登錄
    工廠模式定義:定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。
    工廠模式分為三種:簡單工廠模式悼做、工廠方法模式气笙、抽象工廠模式猖腕。
    工廠方法模式主要用來創(chuàng)建復(fù)雜的對象,簡單對象能夠使用new來創(chuàng)建就不用工廠方法模式來創(chuàng)建了。
原型模式亚再;
策略模式速挑;
裝飾者模式酱酬;
組合模式齿兔;
迭代器模式。

設(shè)計模式的六大原則 :開閉原則,接口隔離原則,合成復(fù)用原則,依賴倒轉(zhuǎn)原則,里氏替換原則,最少知道原則
java面向?qū)ο蟮奈宕笤瓌t:單一職責(zé)原則葫男,開放封閉原則抱冷,里氏替換原則,依賴倒置原則梢褐,接口隔離原則

Android

Handler的原理

Handler旺遮,Message,looper 和 MessageQueue 構(gòu)成了安卓的消息機制盈咳,
    1.handler創(chuàng)建后可以通過 sendMessage 將消息加入消息隊列
    2.然后 looper不斷的將消息從 MessageQueue(單鏈表) 中取出來
    3.回調(diào)到 Hander 的 handleMessage方法耿眉,從而實現(xiàn)線程的通信。

如何在子線程創(chuàng)建handler
    1.Looper.prepare(); Handler handler = new Handler(); Looper.loop();
    2.子線程中Handler handler = new Handler(Looper.getMainLooper());鱼响,此時兩者就不在一個線程中鸣剪。

        1)Looper:  一個線程可以產(chǎn)生一個 Looper 對象,由它來管理此線程里的 MessageQueue( 消息隊列 ) 和對消息進(jìn)行循環(huán)丈积。 
        
        2)Handler:  你可以構(gòu)造 Handler 對象來與 Looper 溝通筐骇,以便 push 新消息到 MessageQueue 里 ; 或者接收 Looper 從 Message Queue 取出 所送來的消息。 
        
        3) Message Queue( 消息隊列 ): 用來存放線程放入的消息桶癣。 
        
        4) Message:是線程間通訊的消息載體拥褂。兩個碼頭之間運輸貨物,Message充當(dāng)集裝箱的功能牙寞,里面可以存放任何你想傳遞的消息。


為什么主線程Looper不會阻塞
    因為創(chuàng)建了新的binder線程
主線程Looper創(chuàng)建在哪里
Activity的啟動一般會調(diào)用到ActivityThread,里面有main方法间雀,是初始化activity必經(jīng)階段悔详,我們的Looper,就是在main的過程創(chuàng)建的惹挟。
內(nèi)存泄漏解決方案
寫靜態(tài)內(nèi)部類茄螃,并且用弱引用

進(jìn)程之間的通信IPC

1.Bundle (四大組件間)通過intent傳入Bundle
2.文件共享 序列化Serialzable與Parcelable
3.AIDL (基于Binder) 
4.Messenger(基于Binder) 
5.ContentProvider(基于Binder) 
6.Socket(網(wǎng)絡(luò)) 

安卓多線程的方式

    AsyncTask
    HandlerThread:封裝了Handler + Thread。
    IntentService
通信方式
    1.runOnUiThread(Runnable) 
    2.使用Handler
    3.使用AsyncTask

LeakCanary

內(nèi)存泄漏
傳統(tǒng)意義上的內(nèi)存泄漏是至忘記手動釋放內(nèi)存连锯,導(dǎo)致未釋放的內(nèi)存不可使用的現(xiàn)象归苍。
嚴(yán)格說:只有對象不會再被程序用到了,但是GC又不能回收他們的情況运怖,才叫內(nèi)存泄漏拼弃。
jvm 的內(nèi)存泄漏
jvm的內(nèi)存泄漏指的是我們本不再需要的內(nèi)存,躲過了垃圾回收的現(xiàn)象摇展。
android中的內(nèi)存泄漏指的是 短生命周期的對象被長生命周期的對象所持有吻氧,導(dǎo)致無法進(jìn)行垃圾回收的現(xiàn)象。

當(dāng)一個Activity(Object)被回收時咏连,會執(zhí)行 finalize()盯孙。可以通過finalize()是否執(zhí)行判斷Activity是否被回收祟滴。
內(nèi)存泄漏舉例
單例的生命周期和應(yīng)用程序是一樣長的振惰,單例的靜態(tài)特性使得其生命周期和應(yīng)用的生命周期一樣長,如果一個
對象已經(jīng)不再需要使用了垄懂,而單例對象還持有該對象的引用报账,就會使得該對象不能被正常回收埠偿,從而導(dǎo)致了內(nèi)存泄漏透罢。
一些提供close的資源未關(guān)閉導(dǎo)致內(nèi)存泄漏 數(shù)據(jù)庫連接( dataSourse. getConnection()),網(wǎng)絡(luò)連接
(socket)和io連接必須手動close冠蒋,否則是不能被回收的羽圃。

性能優(yōu)化

布局優(yōu)化:<include>復(fù)用,<viewStub>延遲加載抖剿,<merge>減少層級
網(wǎng)絡(luò)優(yōu)化:重連朽寞,離線緩存,Network Monitor檢測
內(nèi)存優(yōu)化:LeakCanary斩郎,Handler脑融,單例模式,EventBus缩宜,bitmap,buttenkinf,資源對象close()肘迎、destroy()甥温、recycler()、release();軟引用
啟動優(yōu)化:Application的onCreate(特別是第三方SDK初始化)妓布,可以放到子線程或者IntentService中
UI優(yōu)化:動畫優(yōu)化姻蚓,過度繪制,開發(fā)者模式工具
圖片優(yōu)化:壓縮匣沼,等比例狰挡,采樣率,RGB释涛,Bitmap
APK瘦身:圖片資源壓縮加叁,資源文件混淆,去除SO文件ARMv7/ARMv8唇撬,資源網(wǎng)絡(luò)動態(tài)加載它匕,移除無用資源。

屏幕適配

原因:android碎片化嚴(yán)重局荚,

“布局”匹配
    使用相對布局(RelativeLayout)超凳,禁用絕對布局(AbsoluteLayout)
    還可以用約束布局
    通過限定符(不同分辨率的Layout文件夾)使得程序在運行時根據(jù)當(dāng)前設(shè)備的配置(屏幕尺寸)自動加載合適的布局資源
“布局組件”匹配
    不使用px,盡量用dp
    多套 dimens 適配耀态,建立多個不同分辨率的 values 文件夾
    多使用帶權(quán)重的屬性
“圖片資源”匹配
    點9的使用
    xhdpi應(yīng)該是首選轮傍,只需選擇唯一一套分辨率規(guī)格的圖片資源

主流適配

1.寬高限定符適配
    寬高限定符適配也可以叫屏幕分辨率適配,需要在res文件下創(chuàng)建各種針對不同屏幕分辨率對應(yīng)的values文件夾首装。
2.SmallestWidth適配 -主流
    SmallestWidth適配可以稱為最小寬度適配创夜。不管屏幕是橫屏還是豎屏,都會以最小的那一邊作為寬度進(jìn)行適配仙逻。
3.今日頭條適配方案 -主流
    原理:動態(tài)修改手機的像素密度(density)
    AndroidAutoSize

Bitmap二次采樣驰吓,LruCache緩存管理

二次采樣:BitmapFactory.Options()加載大小,獲取寬高系奉,定義縮放比例檬贰,加載圖片;
LruCache的核心思想很好理解缺亮,就是要維護(hù)一個緩存對象列表(LinkedHashMap)翁涤,其中對象列表排列方式是按照訪問順序?qū)崿F(xiàn)的,
即一直沒訪問的對象萌踱,將放在隊尾葵礼,即將被淘汰
三級緩存分別是內(nèi)存LruCache和本地DiskLruCache和網(wǎng)絡(luò)

Android五種儲存方式

文件存儲
SharedPreferences
SQLite數(shù)據(jù)庫存儲
ContentProvider
網(wǎng)絡(luò)存儲

自定義VIew

自定義View三種方式,組合現(xiàn)有控件并鸵,繼承現(xiàn)有控件鸳粉,繼承View
重寫方法:onMeasure妹奢、 onLayout园担、onDraw届谈、onTouchEvent  (ViewGroup才onLayout)
測量模式MeasureSpec:exactly枯夜,at_most,unspecified

步驟
1.在res/values/下建立一個attrs.xml疼约,用來自定義View的屬性
2.構(gòu)造函數(shù)卤档,getTheme().obtainStyledAttributes(a ture biu te)獲取屬性
3.重寫onMesure時蝙泼,需要知道MeasureSpec的三種類型:
4.重寫onDraw函數(shù)程剥,根據(jù)讀取到的自定義屬性,繪制出相應(yīng)的控件:canvas Paint
Android view的刷新:
    //只會觸發(fā)執(zhí)行onDraw方法汤踏,只會改變繪制里面的內(nèi)容,條目的繪制
    invalidate(); 
     //只會觸發(fā)執(zhí)行onDraw方法织鲸,但是可以在子線程中刷新
    postInvalidate();   
     //view的布局參數(shù)改變之后刷新,比如view的寬度和高度都修改了溪胶,只能通過requestLayout()方法刷新
    requestLayout();

事件分發(fā)機制

1.傳遞的順序:Activity -> ViewGroup -> View
    (Activity——>PhoneWindow——>DecorView——>ViewGroup——>View)
2.經(jīng)過的方法dispatchTouchEvent() 搂擦、onInterceptTouchEvent()和onTouchEvent()
3.事件列都是以DOWN事件開始、UP事件結(jié)束哗脖,中間有無數(shù)的MOVE事件瀑踢,如下圖:
4.如果事件不被中斷,整個事件流向是一個類U型圖才避,傳遞分發(fā)是往下走橱夭,消費響應(yīng)是往上走的
getParent().requestDisallowInterceptTouchEvent(true);組織上層攔截

java和js交互四種方式

安卓調(diào)用js

webView.loadUrl();
webView.evaluateJavascript()

js調(diào)用安卓

webView.addJavascriptInterface()
WebViewClient.shouldOverrideUrlLoading()

斷點續(xù)傳

setRequestProperty() Range
RandomAccessFile()的Seek()寫入

Glide

glide最大的優(yōu)勢就是對bitmap的管理是跟隨生命周期去發(fā)生改變的,glide的優(yōu)勢就是當(dāng)Activity銷毀的時候,之前加載的所有圖片的內(nèi)存都釋放了桑逝。
glide如何監(jiān)聽到Activity的生命周期
glide是通過新建一個空的Fragment去監(jiān)聽Activity的生命周期棘劣。
Fragment和Actvity關(guān)聯(lián)上了,這樣就可以通過Fragment得知當(dāng)前Activty的生命周期楞遏。
緩存
diskCacheStrategy()方法更改緩存策略
Glide 緩存機制主要分為2種:內(nèi)存緩存和磁盤緩存
使用內(nèi)存緩存的原因是:防止應(yīng)用重復(fù)將圖片讀入到內(nèi)存茬暇,造成內(nèi)存資源浪費。
使用磁盤緩存的原因是:防止應(yīng)用重復(fù)從網(wǎng)絡(luò)或其它地方下載和讀取數(shù)據(jù)寡喝。
其中內(nèi)存緩存是由弱引用+LruCache組成糙俗。磁盤緩存就是通過DiskLruCache
LruCache的核心思想很好理解,就是要維護(hù)一個緩存對象列表(LinkedHashMap)预鬓,根據(jù)Lru算法來管理圖片巧骚。大致的原理是利用linkHashMap鏈表的特性,把最近使用過的文件插入到列表頭部珊皿,沒使用的圖片放在尾部网缝;
讀取數(shù)據(jù)的順序是:弱引用 > LruCache > DiskLruCache>網(wǎng)絡(luò);
寫入緩存的順序是:網(wǎng)絡(luò) --> DiskLruCache--> LruCache-->弱引用

Okhttp

OKhttp用了哪些設(shè)計模式
    責(zé)任鏈模式蟋定,建造者粉臊,觀察者,工廠模式驶兜,單例模式
Okhttp的核心類有哪些扼仲?簡單講一下
    Dispatcher類:調(diào)度
    Interceptor類(in te san pu che):攔截
OkHttp的優(yōu)勢
    1.易使用远寸、易擴(kuò)展。
    2.支持緩存處理屠凶,可以避免重復(fù)請求驰后。
    3.OkHttp 還處理了代理服務(wù)器問題和SSL握手失敗問題
    4.如果你的服務(wù)有多個 IP 地址,當(dāng)?shù)谝淮芜B接失敗矗愧,OkHttp 會嘗試備用地址灶芝。
幾個攔截器的作用:
    RetryAndFollowUpInterceptor:重試和失敗重定向攔截器         
    BridgeInterceptor:橋接攔截器,處理一些必須的請求頭信息的攔截器        
    CacheInterceptor:緩存攔截器唉韭,用于處理緩存       
    ConnectInterceptor:連接攔截器夜涕,建立可用的連接,是CallServerInterceptor的基本      

volley:高并發(fā)属愤,同時請求女器,小數(shù)據(jù)。HttpURLConnection住诸,封裝好
Okhttp:大文件上傳下載驾胆,攔截器,緩存贱呐。封裝麻煩丧诺,callback回來是在子線程里面
Retrofit:封裝好,restFul

Binder

Binder通信機制采用C/S架構(gòu)吼句,這很重要9亍!惕艳!

MVC MVP MVVM

MVVM模式中搞隐,一個ViewModel和一個View匹配,它沒有MVP中的IView接口远搪,而是完全的和View綁定

MVC 編程模式
(Model View Controller 模型-視圖-控制器)
    MVP
全稱:Model-View-Presenter 劣纲;MVP 是從經(jīng)典的模式MVC演變而來,它們的基本思想有相通的地方Controller/Presenter負(fù)責(zé)邏輯的處理谁鳍,Model提供數(shù)據(jù)癞季,View負(fù)責(zé)顯示。
MVVM
MVVM是Model-View-ViewModel的簡寫倘潜。
1.mvvm模式將Presener改名為View Model绷柒,基本上與MVP模式完全一致,唯一的區(qū)別是涮因,它采用雙向綁定(data-binding)
2.它實現(xiàn)了View和Model的自動同步

第三方IM

環(huán)信
容聯(lián)云
融云
極光IM
云通訊IM(騰訊)
云旺IM(阿里)
網(wǎng)易云信
聲網(wǎng) 視頻直播

dataBinding

mvvm模式
在xml中寫(邏輯)代碼
消除findViewById (我選擇kt)
Jetpack Compose  顛覆性 的 聲明式 UI 框架 废睦,它的口號就是 消滅 xml 文件 !
jetpack-> Lifecycle LiveData ViewModel dataBinding

Service

Activity和Service通信的幾種方式
    1.通過Binder對象,在Service里面重寫onBind()养泡,通過ta返回我們的Service對象嗜湃。也可以接口回調(diào)
    2.通過broadcast(廣播)的形式奈应。
Service 和 IntentService的區(qū)別;
    1.首先购披,IntentService是繼承的Service
    2.Service做耗時操作會ANR杖挣,因為也是主線程;
    3.IntentService做耗時操作刚陡,ta里面的onHandlerIntent()方法走完就會銷毀掉自己
StartService和BindServer啟動區(qū)別
    1.對Service生命周期的影響
    2.啟動的Service是獨立于開啟它的Activity的惩妇。Activity退出后,Service仍然在運行中橘荠。
    3.啟動的Service是與開啟它的Activity梆定在一起的屿附。Activity退出時郎逃,Service會同時退出哥童。
    擴(kuò)展:(同時使用)(想要啟動一個后臺服務(wù)長期進(jìn)行某項任務(wù)又要與其保持通訊)

廣播相關(guān)

原理:
    1.廣播是通過Binder機制,結(jié)合觀察者模式褒翰。
    2.Android中我們發(fā)送廣播內(nèi)容是一個Intent,這個Intent中可以攜帶我們要發(fā)送的數(shù)據(jù)贮懈。
種類:
    1.有序廣播:可以處理,可以停止    
    2.無序廣播:不可以處理优训,不可以停止  
    3.普通廣播 
兩者及其接收廣播的區(qū)別:
    1.動態(tài)注冊廣播不是常駐型廣播朵你,也就是說廣播跟隨Activity的生命周期。注意在Activity結(jié)束前揣非,移除廣播接收器抡医。   
    2.靜態(tài)注冊是常駐型,也就是說當(dāng)應(yīng)用程序關(guān)閉后早敬,如果有信息廣播來忌傻,程序也會被系統(tǒng)調(diào)用自動運行。
用過嗎?
    1.比如系統(tǒng)的網(wǎng)絡(luò)狀態(tài)搞监,電量狀態(tài)水孩,短信收發(fā),
    2.不同App的組件之間的通信
    3.同一App具有多個進(jìn)程的不同組件之間的消息通信 
    4.可以用EvenBus代替琐驴,發(fā)布/訂閱事件總線機制俘种,代替Intent,Handler,Broadcast

封裝Retrofit

Socket和http

OSI七層網(wǎng)絡(luò)模型分別是:
    物理層,數(shù)據(jù)鏈路層绝淡,網(wǎng)絡(luò)層宙刘,傳輸層,會話層牢酵,表示層悬包,應(yīng)用層。
socket是什么茁帽?
    Socket不是一種協(xié)議玉罐,而是一個編程調(diào)用接口屈嗤。
socket和http區(qū)別
    1.Socket 是對 TCP/IP 協(xié)議的封裝,長連接,理論上客戶端和服務(wù)器端一旦建立起連接將不會主動斷掉
    2.HTTP 協(xié)議:http連接就是所謂的短連接吊输,即客戶端向服務(wù)器端發(fā)送一次請求饶号,服務(wù)器端響應(yīng)后連接即會斷掉;
    TCP/IP是傳輸層協(xié)議季蚂,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸茫船;
    HTTP是應(yīng)用層協(xié)議,主要解決如何包裝數(shù)據(jù)扭屁。
Tcp和Udp
    1.TCP/IP協(xié)議擁有三次握手雙向機制算谈,這一機制保證校驗了數(shù)據(jù),保證了他的可靠性料滥。
    2.UDP就沒有了然眼,udp信息發(fā)出后,不驗證是否到達(dá)對方,所以不可靠。
TCP的三次握手和四次揮手
    報文
Socket和WebSocket的區(qū)別
    1.Socket是應(yīng)用層與傳輸層的一個抽象
    2.WebSocket是應(yīng)用層協(xié)議葵腹,它是基于TCP實現(xiàn)的高每,服務(wù)端主動向客戶端推送數(shù)據(jù),雙向通訊
 android Get與Post的本質(zhì)區(qū)別 
    1. get是從服務(wù)器上獲取數(shù)據(jù)践宴,post是向服務(wù)器傳送數(shù)據(jù)鲸匿。
    2. get是把參數(shù)數(shù)據(jù)是透明的,post是采用post機制把數(shù)據(jù)和值放到head里面
    3. get傳送的數(shù)據(jù)量較小阻肩,不能大于2KB带欢。post傳送的數(shù)據(jù)量較大,一般被默認(rèn)為不受限制烤惊。
    4. get安全性非常低乔煞,post安全性較高。但是執(zhí)行效率卻比Post方法好撕氧。
做數(shù)據(jù)查詢時瘤缩,建議用Get方式;而在做數(shù)據(jù)添加伦泥、修改或刪除時剥啤,加密,建議用Post方式不脯;

Android加密方式

1.MD5 不可逆
2.AES加密:一種高級區(qū)塊加密標(biāo)準(zhǔn)府怯。它是一個對稱密碼,就是說加密和解密用相同的密鑰防楷。
3.RSA加密:非對稱加密算法牺丙,非對稱加密算法需要兩個密鑰:公共密鑰和私有密鑰。

flutter

dart語言

異常捕獲
bitmap圖片壓縮
rx
dagger
retrofit
mvp
js交互
自定義VIew
事件分發(fā)
activity
fragment
版本差異權(quán)限,通知
android新版本新特性
AsyncTask
進(jìn)程之間通訊 binder
mvp
動畫的幾種實現(xiàn)方式
view滑動的幾種方式
startServer和bindServier的區(qū)別

kotlin

簡潔冲簿,lambda
類型推斷
空指針
協(xié)程
高階函數(shù)

簡化空對象的處理(防止空指針)

其他

項目管理工具

jira和禪道

java多線程和android線程
ndk futter
Jetpack
kotlin與java的區(qū)別

遇到的技術(shù)難點粟判,如何解決的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市峦剔,隨后出現(xiàn)的幾起案子档礁,更是在濱河造成了極大的恐慌,老刑警劉巖吝沫,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呻澜,死亡現(xiàn)場離奇詭異,居然都是意外死亡惨险,警方通過查閱死者的電腦和手機羹幸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辫愉,“玉大人栅受,你說我怎么就攤上這事∫晃荩” “怎么了窘疮?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長冀墨。 經(jīng)常有香客問我,道長涛贯,這世上最難降的妖魔是什么诽嘉? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮弟翘,結(jié)果婚禮上虫腋,老公的妹妹穿的比我還像新娘。我一直安慰自己稀余,他們只是感情好悦冀,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著睛琳,像睡著了一般盒蟆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上师骗,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天历等,我揣著相機與錄音,去河邊找鬼辟癌。 笑死寒屯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的黍少。 我是一名探鬼主播寡夹,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼处面,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了菩掏?” 一聲冷哼從身側(cè)響起鸳君,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎患蹂,沒想到半個月后或颊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡传于,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年囱挑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沼溜。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡平挑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出系草,到底是詐尸還是另有隱情通熄,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布找都,位于F島的核電站唇辨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏能耻。R本人自食惡果不足惜赏枚,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晓猛。 院中可真熱鬧饿幅,春花似錦、人聲如沸戒职。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洪燥。三九已至磕秤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚓曼,已是汗流浹背亲澡。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纫版,地道東北人床绪。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親癞己。 傳聞我的和親對象是個殘疾皇子膀斋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容