重新加一个window_Activity、View、Window关系,进程间通信,责任链模式,Https,数据存储...
碼仔,今天就給大家帶來了《每日一道面試題》的第九期:
01
理解Activity View window的關系?
Activity像一個工匠(控制單元),Window像窗戶(承載模型),View像窗花(顯示視圖)LayoutInflater像剪刀,Xml配置像窗花圖紙。?
Activity構造的時候會初始化一個Window,準確的說是PhoneWindow。?
這個PhoneWindow有一個“ViewRoot”,這個“ViewRoot”是一個View或者說ViewGroup,是最初始的根視圖。?
“ViewRoot”通過addView方法來一個個的添加View。比如TextView,Button等?
這些View的事件監聽,是由WindowManagerService來接受消息,并且回調Activity函數。比如onClickListener,onKeyDown等
02
Android進程間通訊的幾種姿勢?
進程間通信即IPC,英文全稱Inter-Process Communication,是指進程間數據交互的過程. Android底層是基于Linux,而Linux基于安全考慮,是不允許兩個進程間直接操作對方的數據,這就是進程隔離. 六種常用姿勢:
Bundle
文件共享
AIDL
Messenger
ContentProvider
Socket
03
談談對責任鏈模式的理解
使很多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止。
何時使用:
有許多對象可以處理用戶請求,希望程序在運行期間自動確定處理用戶的那個對象。
希望用戶不必明確指定接收者的情況下,想多個接受者的一個提交請求
程序希望動態的指定可處理用戶請求的對象集合
優點:
低耦合
可以動態的添加刪除處理者或重新指派處理者的職責
可以動態改變處理者之間的先后順序
通常來說,一個純粹的責任鏈是先傳給第一個處理,如果處理過了,這個請求處理就此結束,如果沒有處理,再傳給下一個處理者。
比如我們有一個數學公式,有一個整數輸入,要求小于0時返回絕對值,其次,小于10的時候返回他的二次冪,否則,返回他本身:
首先我們要定義一個接口(處理者),來描述他們共有的行為:
public interface Handler {int handleRequest(int n);
void setNextHandler(Handler next);
}
然后是具體的處理者
public class Handler1 implements Handler {private Handler next;
@Override
public int handleRequest(int n) {
if(n<0) return -n;
else{
if(next==null)
throw new NullPointerException("next 不能為空");
return next.handleRequest(n);
}
}
@Override
public void setNextHandler(Handler next) {
this.next = next;
}
}public class Handler2 implements Handler {
private Handler next;
@Override
public int handleRequest(int n) {
if(n<10) return n*n;
else{
if(next==null)
throw new NullPointerException("next 不能為空");
return next.handleRequest(n);
}
}
@Override
public void setNextHandler(Handler next) {
this.next = next;
}
}public class Handler3 implements Handler {
private Handler next;
@Override
public int handleRequest(int n) {
if(n<=Integer.MAX_VALUE) return n;
else{
if(next==null)
throw new NullPointerException("next 不能為空");
return next.handleRequest(n);
}
}
@Override
public void setNextHandler(Handler next) {
this.next = next;
}
}public class TestUse {
public static void main(String args[]){
Handler h1,h2,h3;
h1 = new Handler1();
h2 = new Handler2();
h3 = new Handler3();
h1.setNextHandler(h2);
h2.setNextHandler(h3);
System.out.println(h1.handleRequest(-1));
System.out.println(h1.handleRequest(5));
System.out.println(h1.handleRequest(9999));
}
}
此處責任鏈中的具體處理者的順序是不能重設的,否則可能會引發錯誤,但更多的情況是完全可以隨意更改他們的位置的,就上例中,只要把if中的條件重新設置(各自獨立,不相互依賴),就可以了。
我們使用責任鏈模式的時候,不一定非得某一處理者處理后就得終止請求的傳遞,如果有其他需求,我們依然可以繼續傳遞這個請求到下一個具體的處理者。
04
Https三次握手四次揮手?
三次握手:在TCP/IP協議中,TCP協議提供可靠的連接服務,采用三次握手建立一個連接。(1)第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,并進入SYN_SEND狀態,等待服務器確認;(2)第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器 進入SYN_RECV狀態;(3)第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入 ESTABLISHED狀態,完成三次握手。完成三次握手,客戶端與服務器開始傳送數據.
四次分手:(1)客戶端A發送一個FIN,用來關閉客戶A到服務器B的數據傳送。(2)服務器B收到這個FIN,它發回一個ACK,確認序號為收到的序號加1。和SYN一樣,一個FIN將占用一個序號。(3)服務器B關閉與客戶端A的連接,發送一個FIN給客戶端A。(4)客戶端A發回ACK報文確認,并將確認序號設置為收到序號加1。
05
Android的存儲方式?
Android提供了5中存儲數據的方式,分別是以下幾種:
1、使用Shared Preferences存儲數據,用來存儲key-value,pairs格式的數據,它是一個輕量級的鍵值存儲機制,只可以存儲基本數據類型。
2、使用文件存儲數據,通過FileInputStream和FileOutputStream對文件進行操作。在Android中,文件是一個應用程序私有的,一個應用程序無法讀寫其他應用程序的文件。
3、使用SQLite數據庫存儲數據,Android提供的一個標準數據庫,支持SQL語句。
4、使用Content Provider存儲數據,是所有應用程序之間數據存儲和檢索的一個橋梁,它的作用就是使得各個應用程序之間實現數據共享。它是一個特殊的存儲數據的類型,它提供了一套標準的接口用來獲取數據,操作數據。系統也提供了音頻、視頻、圖像和個人信息等幾個常用的Content Provider。如果你想公開自己的私有數據,可以創建自己的Content Provider類,或者當你對這些數據擁有控制寫入的權限時,將這些數據添加到Content Provider中實現共享。外部訪問通過Content Resolver去訪問并操作這些被暴露的數據。
5、使用網絡存儲數據
06
結束語?
如果你有好的答案可以提交至:
https://github.com/codeegginterviewgroup/CodeEggDailyInterview
往期文章:
? 《每日一道面試題》第一期
《每日一道面試題》 第二期
《每日一道面試題》 第三期
《每日一道面試題》第四期
? 《每日一道面試題》第五期
《每日一道面試題》 第六期
《每日一道面試題》 第七期
《每日一道面試題》 第八期
專屬社群:
《這件事情,我終于想明白了》?
今日問題:
大家想看什么類型的文章?
總結
以上是生活随笔為你收集整理的重新加一个window_Activity、View、Window关系,进程间通信,责任链模式,Https,数据存储...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个jdbc connection连接对
- 下一篇: java信息管理系统总结_java实现科