Android自問自答系列——持續更新ING

Hello,All,我是來自58同城的一名Android開發工程師,在58集團從事APP的開發工作。在日常的工作和學習過程中我經常會碰到一些好玩的和有意思的Android小知識點,有些知識可能都從未注意到過。通過一個多月的收集和整理,我發現通過不斷地記錄這些問題達到了非常好的複習效果,從而幫助了工作上的持續進步,今天我也是把平時收集到的這些東西發出來供大家一起學習,共同成長,如果感覺好,歡迎點擊右側的留言、點贊、加關注,您的支持是我最大的動力。

PS:關注,私信我,幫你內推58,常年招聘前端,移動端,後端,算法。

也歡迎關注我的公衆號,在這裏可以找到我,同時,這裏會不定期地推送一些時下最熱門的技術文章和互聯網行業工作心路歷程

                                                                       

——於2020年小年夜首發

——2020.2.5日更新


爲什麼android不允許在子線程中更新UI?

因爲Android的UI控件不是線程安全的,採用加鎖機制降低了UI訪問效率,讓UI訪問變得複雜,所以最簡單的做法就是用單線程模型。

 

ThreadLocal的使用以及其內部機制

final ThreadLocal<String> mThreadLocal = new ThreadLocal<>();

mThreadLocal.set("nameMain");

Log.d(TAG, "onResume: " + mThreadLocal.get());

new Thread(new Runnable() {

@Override

public void run() {

mThreadLocal.set("name1");

mThreadLocal.get();

Log.d(TAG, "run: " + mThreadLocal.get());

}

}).start();

 

new Thread(new Runnable() {

@Override

public void run() {

mThreadLocal.set("name2");

mThreadLocal.get();

Log.d(TAG, "run: " + mThreadLocal.get());

}

}).start();

內部機制:

使用Hashmap來存儲數據,使用懶加載策略,將第一個key和value裝入Entry中,

爲什麼使用threadLocal可以緩存不同線程的同一個變量?

在每個線程中都有一個獨立的Hashmap副本來存儲數據

ThreadLocal是一個線程嗎?

不是,他只是提供了一種線程緩存對象的能力。是一個線程內部的數據存儲類,使用它可以在指定的線程中存儲數據,除了創建線程以外,其他線程無法訪問到該線程的數據

 

Handler的使用及其內部原理?

Handler如何避免內存泄漏?

Message能傳遞的最大數據量是多少?

MessageQueue底層實現是什麼?

單鏈表

 

Message的複用原理是什麼?

使用了享元模式的單項鍊表

 

Url支持最大多少數據量承載

 

微信朋友圈圖片加載怎樣防止OOM?

 

Android消息機制是如何實現主子線程之間通信的?

以一次主線程建立Handler,在子線程sendMessage爲例.在主線程建立Handler之後,子線程使用主線程的Handler對象sendMessage方法,最終調用到的是sendMessageAtTime方法,在該方法中又調用了enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis),這裏重點關注兩個傳入參數,queue和msg,queue是在簡歷Looper的時候創建的,msg就是從應用層發送過來的msg,在這個方法裏,又調用了queue的enqueueMessage方法,將msg加入到了queue的消息隊列裏

 

MessageQueue使用了什麼設計模式?

生產者消費者設計模式

 

sendMessageDelayed 和sendMessageAtTime有何區別?

 

URI URN URL都有什麼區別?

個人的身份證號就是URN,個人的家庭地址就是URL,URN可以唯一標識一個人,而URL可以告訴郵遞員怎麼把貨送到你手裏。

 

URI:universal resource identifier統一資源標識符

URN:universal resources Name統一資源名稱

URL:Universal resources Location統一資源定位符

 

HTTP無狀態協議這個概念怎樣理解?

HTTP協議自身不對請求和相應之間的通信狀態進行保存

無狀態的目的是什麼?

爲了快速處理大量事物,確保協議的可伸縮性

 

 

Exception Throwable的區別以及在程序中應該如何去處理?

其實只要是Throwable和其子類都是可以throw和catch的,那麼如果在需要統一處理異常的地方,我們應該catch (Throwable th) 還是 catch (Exception)呢?

這兩種處理的區別在於,catch throwable會把Error和其他繼承Throwable的類捕捉到。而catch Exception只會捕捉Exception極其子類,捕捉的範圍更小。先不考慮有其他的類繼承了Throwable的情況下,第一種catch相當於比第二種catch多捕捉了把Error和其子類。

那麼究竟Error是否需要捕捉呢?JDK中Error類的的註釋(如下)裏提到過,Error是一種嚴重的問題,應用程序不應該捕捉它。

An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch. Most such errors are abnormal conditions. The ThreadDeath error, though a “normal” condition, is also a subclass of Error because most applications should not try to catch it.

A method is not required to declare in its throws clause any subclasses of Error that might be thrown during the execution of the method but not caught, since these errors are abnormal conditions that should never occur.

Java Lanuage Spec 7 中也提到:Error繼承自Throwable而不是繼承自Exception,是爲了方便程序可以使用 “catch (Exception)“來捕捉異常而不會把Error也捕捉在內,因爲Exception發生後可以進行一些恢復工作的,但是Error發生後一般是不可恢復的。

The class Error is a separate subclass ofThrowable, distinct from Exception in the class

hierarchy, to allow programs to use the idiom “} catch (Exception e) { ” (§11.2.3)

to catch all exceptions from which recovery may be possible without catching errors from which recovery is typically not possible.

已經不難看出,Java本身設計思路就是希望大家catch Exception就足夠了,如果有Error發生,catch了也不會有什麼作用。

 

cookie是放在http報文的哪裏?

消息頭

 

 

Android設計模式:原型模式(深拷貝、淺拷貝)

 

try...catch和throws的區別

throws:java  throws關鍵字是跟在方法名之後的,一個thrwos後面可以跟至少一個的異常類型,它的作用是:當前方法可能會拋出異常,但是不知道如何處理該異常,就將該異常交由調用這個方法的的上一級使用者處理,如果main方法也不知道如何處理這個異常的時候,就會交由JVM來處理這個異常

 

當一個方法使用了throws關鍵字之後,調用這個方法的使用者就應該顯式地處理這個異常,要麼使用try..catch來處理,要麼也使用throws關鍵字,將異常繼續交由上一層使用者處理

 

throws關鍵字的使用是有限制的,即子類聲明的拋出異常不允許是父類聲明拋出異常的父類異常,即如果子類聲明拋出Exception,父類就不能聲明拋出NullPointerException

 

try...catch:

出現異常之後立即處理

 

Integer的取值範圍:

-2^32~2^32

 

 

java泛型中<?>和<T>有什麼區別?

T 代表一種類型

T extends T2 指傳的參數爲T2或者T2的子類型。

?是通配符,泛指所有類型

? extends T 指T類型或T的子類型

? super T   指T類型或T的父類型

特例:帶通配符的List僅表示它是各種泛型List的父類,並不能把元素加入其中,如下將引起編譯錯誤:

List<?> list = new ArrayList<String>();

list.add("aaa");

 

泛型只存在於編譯時

 

Java獲得Class對象的三種方式:

Class.forName();(該方法需要傳入類的全限定名作爲參數,且必須添加完整包名)

類的Class屬性

調用對象的getClass屬性

 

java 向上轉型 向下轉型

1、父類引用指向子類對象,而子類引用不能指向父類對象。

2、把子類對象直接賦給父類引用叫upcasting向上轉型,向上轉型不用強制轉換嗎,如:

Father f1 = new Son();3、把指向子類對象的父類引用賦給子類引用叫向下轉型(downcasting),要強制轉換,如:

f1 就是一個指向子類對象的父類引用。把f1賦給子類引用 s1 即 Son s1 = (Son)f1;

其中 f1 前面的(Son)必須加上,進行強制轉換。

 

使用泛型,有2個好處:

1.不需要做強制類型轉換

2.編譯時更安全。如果使用Object類的話,你沒法保證返回的類型一定是Foo,也許是其它類型。這時你就會在運行時得到一個類型轉換異常(ClassCastException)

 

AOP和OOP區別

AOP的典型語言:AspectJ,他支持Java,是Java的擴展

 

從Java7開始,允許在構造器後不需要帶完整的泛型信息,只需要給出一對尖括號即可。例:ArrayList<String> arrayList = new ArrayList<>();

 

 

Android源碼設計模式一書中將責任鏈設計模式和廣播結合起來,通過onReceive和setResultExtras來進行責任鏈調用,避免了過多類的創建,值得借鑑。

 

Activity AppCompatActivity FragmentActivity區別

  1. Fragmentactivity 繼承自activity,用來解決android3.0 之前沒有fragment的api,所以在使用的時候需要導入support包,同時繼承fragmentActivity,這樣在activity中就能嵌入fragment來實現你想要的佈局效果

2.AppcompaActivity相對於Activity的主要的兩點變化;

1,主界面帶有toolbar的標題欄;

2,theme主題只能用android:theme=”@style/AppTheme (appTheme主題或者其子類),而不能用android:style。

3,Activity以上兩類的基類

什麼是序列化

序列化,表示將一個對象轉換成可存儲或可傳輸的狀態。序列化後的對象可以在網絡上進行傳輸,也可以存儲到本地

Parcelable和Serializable的區別和比較

Parcelable和Serializable都是實現序列化並且都可以用於Intent間傳遞數據,Serializable是Java的實現方式,可能會頻繁的IO操作,所以消耗比較大,但是實現方式簡單 Parcelable是Android提供的方式,效率比較高,但是實現起來複雜一些 , 二者的選取規則是:內存序列化上選擇Parcelable, 存儲到設備或者網絡傳輸上選擇Serializable(當然Parcelable也可以但是稍顯複雜)

 

選擇序列化方法的原則

1)在使用內存的時候,Parcelable比Serializable性能高,所以推薦使用Parcelable。

2)Serializable在序列化的時候會產生大量的臨時變量,從而引起頻繁的GC。

3)Parcelable不能使用在要將數據存儲在磁盤上的情況,因爲Parcelable不能很好的保證數據的持續性在外界有變化的情況下。儘管Serializable效率低點,但此時還是建議使用Serializable 。

 

 

Parcelable接口使用:

1.選擇序列化方法的原則

1)在使用內存的時候,Parcelable比Serializable性能高,所以推薦使用Parcelable。

2)Serializable在序列化的時候會產生大量的臨時變量,從而引起頻繁的GC。

3)Parcelable不能使用在要將數據存儲在磁盤上的情況,因爲Parcelable不能很好的保證

     數據的持續性在外界有變化的情況下。儘管Serializable效率低點,但此時還是建議使

     用Serializable 。

2.使用場景:

需要在多個部件(Activity或Service)之間通過Intent傳遞一些數據,簡單類型(如:數字、

字符串)的可以直接放入Intent。複雜類型必須實現Parcelable接口。

3.使用Parcelable步驟:

1)implements Parcelable

2)重寫writeToParcel方法,將你的對象序列化爲一個Parcel對象,即:將類的數據寫入

外部提供的Parcel中,打包需要傳遞的數據到Parcel容器保存,以便從 Parcel容器獲取數據

3)重寫describeContents方法,內容接口描述,默認返回0就可以

4)實例化靜態內部對象CREATOR實現接口Parcelable.Creator

public static final Parcelable.Creator<T> CREATOR

 

如何實現關閉多個Activity?

方法一:在每個Activity啓動時將實例傳給Activity內部持有的一個靜態變量,關閉時直接進行關閉

方法二:將Activity註冊進List中進行管理,關閉時進行list輪詢

 

 

創建Java線程一共有幾種方式?

  1. Thread

  2. Runnable

  3. 線程池

  4. Callable

Thread和Runnable,Callable對比:

1.Thread是一個類,Callable,Runnable是接口,接口可以多實現,類只能單繼承

2.Callable結合FutureTask實現的方式下,多線程可以實現共享同一個FutureTask對象,適合多個線程處理同一份資源的情況

3.Callable編程稍複雜,在Thread實現下,使用this即可訪問當前線程對象,而Callable需要使用Thread.currentThread();

 

線程在什麼情況下會阻塞?

  1. 調用了線程的sleep方法,但該方法不會放棄鎖

  2. 調用了阻塞式IO方法,在方法返回之前,線程被阻塞

  3. 線程試圖獲得同步監視器,但該同步監視器正在被其他線程持有

  4. 線程正在等待通知

  5. 調用了線程的suspend方法將線程掛起,但這個方法容易導致死鎖。

 

線程讓步(yield):

  1. 暫停當前正在執行的線程對象,並執行其他線程。

  2. 意思就是調用yield方法會讓當前線程交出CPU權限,讓CPU去執行其他的線程。它跟sleep方法類似,同樣不會釋放鎖。

  3. 但是yield不能立刻交出CPU,會出現同一個線程一直執行的情況,另外,yield方法只能讓擁有相同優先級的線程有獲取CPU執行時間的機會。

  4. 注意調用yield方法並不會讓線程進入阻塞狀態,而是讓線程重回就緒狀態,它只需要等待重新獲取CPU執行時間,這一點是和sleep方法不一樣的

 

 

線程池的核心線程數怎樣設置?

CPU密集型任務

儘量使用較小的線程池,一般爲CPU核心數+1。

因爲CPU密集型任務使得CPU使用率很高,若開過多的線程數,只能增加上下文切換的次數,因此會帶來額外的開銷。

IO密集型任務

可以使用稍大的線程池,一般爲2*CPU核心數。

IO密集型任務CPU使用率並不高,因此可以讓CPU在等待IO的時候去處理別的任務,充分利用CPU時間。

 

線程池的執行策略:

step1.調用ThreadPoolExecutor的execute提交線程,首先檢查CorePool,如果CorePool內的線程小於CorePoolSize,新創建線程執行任務。

step2.如果當前CorePool內的線程大於等於CorePoolSize,那麼將線程加入到BlockingQueue。

step3.如果不能加入BlockingQueue,在小於MaxPoolSize的情況下創建線程執行任務。

step4.如果線程數大於等於MaxPoolSize,那麼執行拒絕策略。

 

什麼是CAS?

使用鎖時,線程獲取鎖是一種悲觀鎖策略,即假設每一次執行臨界區代碼都會產生衝突,所以當前線程獲取到鎖的時候同時也會阻塞其他線程獲取該鎖。而CAS操作(又稱爲無鎖操作)是一種樂觀鎖策略,它假設所有線程訪問共享資源的時候不會出現衝突,既然不會出現衝突自然而然就不會阻塞其他線程的操作。因此,線程就不會出現阻塞停頓的狀態。那麼,如果出現衝突了怎麼辦?無鎖操作是使用CAS(compare and swap)又叫做比較交換來鑑別線程是否出現衝突,出現衝突就重試當前操作,直到沒有衝突爲止。

 

syntronized和CAS區別?

Synchronized VS CAS

元老級的Synchronized(未優化前)最主要的問題是:在存在線程競爭的情況下會出現線程阻塞和喚醒鎖帶來的性能問題,因爲這是一種互斥同步(阻塞同步)。而CAS並不是武斷的間線程掛起,當CAS操作失敗後會進行一定的嘗試,而非進行耗時的掛起喚醒的操作,因此也叫做非阻塞同步。這是兩者主要的區別。

 

Atomic類的原理是什麼呢?

atomic類是通過自旋CAS操作volatile變量實現的。

 

Java如何創建線程池?

通過實現ThreadPoolExecutor,並向其中設置coreSize,MAX_SIZE,等值來實現線程池的設置,最後調用execute來執行任務。

 

 

android版本更新簡介:

android 10:

支持摺疊屏、5G網絡,暗黑模式(AppCompat實現),手勢導航,用戶隱私設置(用戶可以通過新的權限選項更好地控制他們的位置數據;現在,他們可以允許應用僅在實際使用(在前臺運行)時訪問位置信息。對於大部分應用來說,這提供了足夠的訪問級別;而對於用戶來說,這在確保透明度和控制權方面是一項重大改進。)

 

外部存儲訪問權限範圍限定爲應用文件和媒體。

默認情況下,對於以 Android 10 及更高版本爲目標平臺的應用,其訪問權限範圍限定爲外部存儲,即分區存儲。此類應用可以查看外部存儲設備內以下類型的文件,無需請求任何與存儲相關的用戶權限:

特定於應用的目錄中的文件(使用getExternalFilesDir()訪問)。

應用創建的照片、視頻和音頻片段(通過媒體庫訪問)。

 

Intent傳遞對象的最大限制是多少?

1MB

爲什麼是1MB?

Intent內部使用了Binder傳輸機制,Binder的事務緩衝區限制了傳遞數據的大小。並且,這1MB大小不是當前操作獨享的,而是由整個進程共享的。由於共享的特性,不是傳遞1MB以下的數據就絕對安全,要視情況而定。對於體積較大的數據,可以從數據源考慮,傳遞URL等方式,或者先持久化數據再還原,也可以使用EventBus黏性事件來解決。

 

雙檢查單例模式(DCL)有沒有什麼更好的寫法?

線程安全單例的枚舉實現方式:

 

View真的不可用在子線程進行更新嗎?

不是,View只是不允許在非創建UI的線程中進行更新

Android 窗口的分類

 

狀態機設計模式就是使用一個A類來管理其他狀態子類,並在A中根據狀態的不同持有其他子類的引用,當操作A的動作時也就是操作最新狀態子類的動作

 

 

android WindowManagerService ActivityManagerService

 

android中每個view都有自己的座標系,都是view左上角作爲原點的

Android自定義View:

canvas:繪製view的底板

canvas.drawRect,

drawCircle,

drawLine

,drawOval(畫橢圓),

drawPoint,

drawPoints,

drawRoundRect(圓角矩形)

drawArc

drawPath(自定義畫筆軌跡)

Paint畫筆,可以設置畫筆顏色,抗鋸齒等參數

Path:自定義軌跡

path.addCircle,

path.addOval,

path.addRect,

path.addRoundRect

path.addPath(添加自定義軌跡)

path.lineTo/rlineTo

path.moveTo(因爲默認是從view的左上角開始繪製,可以用這個方法將畫筆移動)

path.close(封閉圖形)

Path還可以設置輔助填充方式

 

爲什麼阿里巴巴開發者手冊中強制不允許在Application中緩存變量?

如果在Application中緩存了變量,當App退到後臺,但在後臺被殺死,重新啓動之後Application對象會被重建,導致數據丟失

 

如何進行佈局優化?

NestedScroolView支持嵌套滑動,可以作爲一個普通的scrollView來使用

 

MessageQueue在什麼時候被創建?

在Looper.prepareMainLooper時候被創建,在prepareMainLooper中通過ThreadLocal set進去了一個Looper這個Looper是被new出來的,其中,new Looper的過程中就包含了創建MessageQueue的過程,並且得到了當前線程的引用。然後,在Looper.loop中開啓了for(;;)循環,開始不斷地輪詢messageQueue中的消息

 

享元模式與單例模式的區別?

享元模式可以再次創建對象 也可以取緩存對象

單例模式則是嚴格控制單個進程中只有一個實例對象

享元模式可以通過自己實現對外部的單例 也可以在需要的使用創建更多的對象

單例模式是自身控制 需要增加不屬於該對象本身的邏輯

 

 

Android中的進程間通信方式?

Intent,基於Binder的Messenger,AIDL,Socket,ContentProvider,文件共享,數據庫。。。

如何在Android中開啓多進程?

給四大組件指定android:process屬性

Android中一個App(一個進程)被分配的內存大小?

早期版本中,內存最大被限制爲16M,且根據設備不同,大小也不一樣。

Android設備出廠以後,Java虛擬機對單個應用的內存分配就固定下來了,超出這個值就會OOM。這個屬性值定義在 /system/build.prop中

可以通過ActivityManager來查看這個值:

ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

int heapGrowthLimit = am.getMemoryClass(); // 192,以m爲單位

在應用開發中,如果要使用大堆,可在manifest文件中指定android:largeHeap爲true,這樣dalvik的堆內存可以達到heapsize。

 

爲什麼Android中每個應用需要單獨開Dalvik虛擬機?

android上的應用是帶有獨立虛擬機的,也就是每開一個應用就會打開一個獨立的虛擬機。這樣設計的優點就是在單個程序崩潰的情況下不會導致整個系統的崩潰。

 

Android View中X,Y,translationX,translationY都指的是什麼

X,Y是View左上角相對於遠點的座標

而translationX,translationY是在左上角座標原點可變的情況下的偏移量

 

 

TouchSlop是什麼?

Android操作系統所能識別的最小滑動距離,

GestrueDetector(收拾識別),Scroller(彈性滑動)

View實現滑動一共有幾種方法?

Android 事件分發機制:

點擊事件的三個重要方法:

onTouchEvent,dispatchTouchEvent,onInterceptTouchEvent

點擊事件的分發可以用如下的僞代碼表示:

@Override

public boolean dispatchTouchEvent(MotionEvent event) {

if (this.interceptTouchEvent){

onTouchEvent(event);

return true;

} else {

child.dispatchTouchEvent();

return false;

}

return super.dispatchTouchEvent(ev);

}

 

點擊事件的傳遞過程:

Activity——》Window——》頂級View

 

當一個View設置了onTouchListener,且返回值爲true,則代表當前事件被Listener消費,不會傳遞到View自身的onTouchEvent

 

如何在activity中獲取準確的View寬高?

(1)onWindowFocusChanged

(2)view.post(runnable)

(3) viewTreeObserver的回調方法:onGlobalLayoutListener,onGlobalLayout

LinearLayout RelativeLayout有什麼區別?

LinearLayout會onMeasure一次,根據橫向和縱向的不同,只measure一次。而RelativeLayout會橫向和縱向都measure一次,性能上不如LinearLayout。

 

onDraw過程是怎樣的?

自定義View的分類

 

drawable的知識點:

獲取drawable的寬高:getIntrinsicWidth,getIntrinsicHeight

drawable一般用來實現一些簡單的view效果

bitmap與drawable的區別和聯繫

https://blog.csdn.net/qq1263292336/article/details/78867461

 

Activity使用反射的方法進行創建,在創建過程中使用了StrictMode

 

final類和final方法:

1. final類

final類不能被繼承,因此final類的成員方法沒有機會被覆蓋,默認都是final的。在設計類時候,如果這個類不需要有子類,類的實現細節不允許改變,並且確信這個類不會載被擴展,那麼就設計爲final類。

2. final方法

如果一個類不允許其子類覆蓋某個方法(即不允許被子類重寫),則可以把這個方法聲明爲final方法。

使用final方法的原因有二:

  • 把方法鎖定,防止任何繼承類修改它的意義和實現。

  • 高效。編譯器在遇到調用final方法時候會轉入內嵌機制,大大提高執行效率。

 

官方建議,在activity可見性方面,最好使用onActivityFocusChanged這個回調而不要使用onResume,而onResume最好用於開啓攝像機,開啓動畫等功能。

 

setContentView都做了什麼?

  1. 檢測是否有ViewGroup也就是ViewParent,如果沒有,則生成一個,如果有ViewParent則把之前存在的View都移除

  2. 然後把加載進來的Layout(xml)inflate出來

  3. 回調onContentChanged

addContentView都做了什麼?

  1. 檢測ViewParent(ViewGroup)是否爲空?如果爲空則install一個

  2. 調用ViewGroup的addView

LayoutInflator.inflate都做了什麼?

最終調用到了addView

 

addView都做了什麼?

先將父佈局layout好(requestLayout),然後依次去調用子元素的requestLayout(innerRequestLayout)

 

 

Activity的setContentView和addContentView有什麼區別?

1.  以添加UI組件是否被移除

setContentView() 會導致先前添加的被移除, 即替換性的;

而 addContentView() 不會移除先前添加的UI組件,即是累積性的

 

2. 是否控制佈局參數

addContentView() 有兩個參數, 可以控制佈局參數; 你指出的這個setContentView 沒有接受佈局參數,

默認使用MATCH_PARENT;  不過setContentView()也有帶兩個參數的版本, 可以控制佈局參數。

 

爲什麼在子線程中創建Handler時候沒有創建Looper會報錯?

因爲通過new的方式創建Handler的時候會檢測是否創建了Looper,因爲子線程在創建時默認不創建looper,所以會報錯。而主線程在ActivityThread中默認會創建mainLooper

 

Android pie(28)無法支持HTTPS,APP該如何適配?

方案一:與服務端協商將http改爲https

方案二:廢棄http接口

方案三:在manifest文件,application中添加屬性android:usesCleartextTraffic="true"

 

從加密解密的角度來解釋公鑰和私鑰在傳輸過程中的作用?

公鑰和私鑰就是俗稱的不對稱加密方式,是從以前的對稱加密(使用用戶名與密碼)方式的提高。非對稱密碼算法:又稱爲公鑰加密算法,是指加密和解密使用不同的密鑰(公開的公鑰用於加密,私有的私鑰用於解密)。比如A發送,B接收,A想確保消息只有B看到,需要B生成一對公私鑰,並拿到B的公鑰。於是A用這個公鑰加密消息,B收到密文後用自己的與之匹配的私鑰解密即可。反過來也可以用私鑰加密公鑰解密。也就是說對於給定的公鑰有且只有與之匹配的私鑰可以解密,對於給定的私鑰,有且只有與之匹配的公鑰可以解密。

 

android四大啓動模式?

standard:標準啓動模式,每次開啓activity都會創建新實例

singgleTop:棧頂複用模式,如果啓動的實例不在棧頂,就創建一個

singgleInstance:單實例模式,啓動activity會新建任務棧

singgleTask:棧內複用模式,如果啓動棧中有實例,則把其之上的實例都銷燬

 

CA證書是什麼?及其在https中的作用和加密原理

CA 是 PKI 系統中通信雙方信任的實體,被稱爲可信第三方(Trusted Third Party,簡稱TTP)。 CA 證書,顧名思義,就是 CA 頒發的證書。

 

CA 的初始是爲了解決上面非對稱加密被劫持的情況,服務器申請 CA 證書時將服務器的“公鑰”提供給 CA,CA 使用自己的“私鑰”將“服務器的公鑰”加密後(即:CA證書)返回給服務器,服務器再將“CA 證書”提供給客戶端。一般系統或者瀏覽器會內置 CA 的根證書(公鑰)

客戶端獲取到“CA 證書”會進行本地驗證,即使用本地系統或者瀏覽器中的公鑰進行解密,每個“CA 證書”都會有一個證書編號可用於解密後進行比對

https://blog.csdn.net/freekiteyu/article/details/76423436

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章