Android知識(shí)體系(1)

Android知識(shí)體系(1)
Android知識(shí)體系(2)

一硕勿、Activity相關(guān)

1泽本、生命周期流轉(zhuǎn)

四個(gè)狀態(tài):running paused stopped killed running:當(dāng)前顯示在屏幕上的Activity娘香,用戶(hù)可見(jiàn)关斜,可交互 paused:依舊用戶(hù)可見(jiàn)冀值,但是已經(jīng)失去焦點(diǎn)伟端,不可交互
stopped:用戶(hù)不可見(jiàn),也不可交互 killed:等待被系統(tǒng)回收

onCreate() >>onStart()>>onResume()>>onRestart()>>onPause()>>onStop()>>onDestory()

Activity A切換到B執(zhí)行方法: A:onCreate()>>onStart()>>onResume()>>onPause()
B:onCreate()>>onStart()>>onResume()
A:onStop()>>onDestory()

A切換到B(B是以DialogActivity形式存在的)執(zhí)行方法: A:onCreate()>>onStart()>>onResume()>>onPause()
B:onCreate()>>onStart()>>onResume()

當(dāng)用戶(hù)按下home后冒萄,再返回臊岸,執(zhí)行的方法: onPause()>>onStop()>>home>>onRestart()>>onResume()

Activity中的onSaveInstanceState和onRestoreInstanceState()
onSaveInstanceState(Bundle outState):
保存有ID組件的狀態(tài),在系統(tǒng)銷(xiāo)毀Activity時(shí)尊流。調(diào)用時(shí)機(jī)是在onStop之前帅戒,但是不確定在onPause之前還是之后。用戶(hù)主動(dòng)銷(xiāo)毀Activity不會(huì)調(diào)用崖技。
onRestoreInstanceState(Bundle outState):
在系統(tǒng)銷(xiāo)毀Activity后逻住,重新創(chuàng)建時(shí)可以調(diào)用。該方法保存的 Bundle 對(duì)象在 Activity 恢復(fù)的時(shí)候也會(huì)通過(guò)參數(shù)傳遞到 onCreate() 方法中;

2迎献、有關(guān)橫豎屏切換生命周期的變化:

橫豎屏切換會(huì)根據(jù)configChanges配置來(lái)決定是否銷(xiāo)毀Activity.

不配置configChanges屬性 設(shè)置android:configChanges="orientation"設(shè)置android:configChanges="orientation|keyboardHidden"(3.2系統(tǒng)之前的系統(tǒng)不會(huì)執(zhí)行生命周期方法了)
以上三種配置瞎访,橫豎屏切換時(shí)Activity均會(huì)銷(xiāo)毀重建,Activity的生命周期都會(huì)重新執(zhí)行一次

配置 android:configChanges="orientation|keyboardHidden|screenSize"不會(huì)銷(xiāo)毀重建

3吁恍、setContentView方法

將Activity對(duì)應(yīng)的xml布局添加到根布局中扒秸。調(diào)用mWindow.setContentView,添加到decorView中冀瓦。

4伴奥、ViewRootImpl\WindowManagerService

相關(guān)資料文章:
Activity的生命周期
Android 橫豎屏切換總結(jié)

二、Fragment相關(guān)

1翼闽、對(duì)應(yīng)生命周期

activity: ----------------onCreate------------------------ | onStart | onResume onPause onStop | onDestroy ----------------------

fragment: onAttach onCreate onCreateView onActivityCreated | onStart | onResume onPause onStop | onDestroy onDestroyView onDetach

2拾徙、fragment如何懶加載

(1)Support時(shí)代:在setUserVisibleHint()方法中判斷是否對(duì)用戶(hù)可見(jiàn)。
(2)ViewPager
(2)ViewPager2

3感局、fragment的add尼啡、show、hide询微、replace

add:添加崖瞭,一般配合hide使用。不會(huì)清空容器(FragmentTransaction)里面的內(nèi)容
replace:替換撑毛。會(huì)清空容器里所有內(nèi)容书聚,只保留一個(gè)fragment顯示。
hide:隱藏
show:顯示

相關(guān)資料文章:
Fragment生命周期
Fragment全解析系列(一):那些年踩過(guò)的坑

三、啟動(dòng)模式(以及使用場(chǎng)景)

standard: 標(biāo)準(zhǔn)模式 不管有沒(méi)有實(shí)例都會(huì)重新創(chuàng)建一個(gè)實(shí)例 場(chǎng)景:多數(shù)普通的Activity界面

singleTop: 棧頂模式 如果實(shí)例位于任務(wù)棧頂寺惫,則不重新創(chuàng)建。若不位于棧頂則重新創(chuàng)建實(shí)例 場(chǎng)景:消息接收界面例如QQ彈出的消息界面

singleTask: 棧內(nèi)唯一模式 若當(dāng)前任務(wù)棧中存在實(shí)例蹦疑,那么將此實(shí)例之上的其它實(shí)例全部退出西雀,使得此實(shí)例位于棧頂 場(chǎng)景:首頁(yè)主界面

singleInstance: 新棧唯一模式 每次都會(huì)新建一個(gè)任務(wù)棧,并且在這個(gè)棧中只存在一個(gè)實(shí)例 場(chǎng)景:與主界面分離的頁(yè)面如鬧鐘提醒

注意:
以上所謂的啟動(dòng)模式是不包含設(shè)置了 intent flag的情況下歉摧。在設(shè)置了intent flag時(shí)艇肴,啟動(dòng)的方式和結(jié)果可能和使用的啟動(dòng)模式不一致。 activity的啟動(dòng)和啟動(dòng)模式叁温、intent
flag再悼、taskAffinity、以及是否是Activity直接啟動(dòng)另一個(gè)Activity相關(guān)膝但,并不是單獨(dú)由啟動(dòng)模式?jīng)Q定的冲九。

相關(guān)資料文章:
Android面試官裝逼失敗之:Activity的啟動(dòng)模式

Flag :
intent.flag_activity_new_task\flag_activity_clear_task\flag_activity_clear_top\flag_activity_single_top

四、APP啟動(dòng)過(guò)程

1跟束、系統(tǒng)相關(guān)成員:

init進(jìn)程: Android系統(tǒng)啟動(dòng)后首先喚醒的進(jìn)程 Zygote進(jìn)程:所有Android進(jìn)程的父進(jìn)程莺奸。 SystemServer進(jìn)程:系統(tǒng)服務(wù)進(jìn)程,負(fù)責(zé)系統(tǒng)中大大小小的各種事務(wù)冀宴。喚起
ActivityManagerService灭贷、PackageManagerService、WindowManagerService ActivityManagerService:
負(fù)責(zé)四大組件的啟動(dòng)略贮、切換甚疟、調(diào)度以及應(yīng)用進(jìn)程的管理和調(diào)度等。對(duì)于一些進(jìn)程的啟動(dòng)逃延,會(huì)通過(guò)Binder通信機(jī)制傳遞給AMS览妖,再處理給Zygote進(jìn)程。 PackageManagerService :
負(fù)責(zé)應(yīng)用包的一些操作真友,如安裝黄痪、卸載、解析AndroidManifest.xml盔然、掃描文件等桅打。 WindowManagerService : 負(fù)責(zé)窗口相關(guān)的操作,如窗口啟動(dòng)愈案、添加挺尾、移除等。
Launcher : 桌面應(yīng)用

2站绪、點(diǎn)擊桌面圖標(biāo)啟動(dòng)流程:

(1)遭铺、Launcher接收點(diǎn)擊事件,調(diào)用StartActivity準(zhǔn)備啟動(dòng)目標(biāo)Activity,同事調(diào)用checkStartActivityResult檢查目標(biāo)Activity魂挂。
內(nèi)部核心邏輯通過(guò)AIDL Binder通信通知ATMS(ActivityTaskManagerService)處理打開(kāi)對(duì)應(yīng)APP. 【Launcher StartActivity】
(2)甫题、ATMS接收到消息后,會(huì)使Launcher進(jìn)入Paused狀態(tài)涂召。 【ATMS StartActivity】
(3)坠非、ATMS判斷目標(biāo)APP對(duì)應(yīng)的進(jìn)程是否已經(jīng)啟動(dòng)。如果已經(jīng)啟動(dòng)則直接打開(kāi)對(duì)應(yīng)Activity果正,如果沒(méi)有啟動(dòng)則需創(chuàng)建對(duì)應(yīng)進(jìn)程炎码。 如何判斷對(duì)應(yīng)進(jìn)程是否啟動(dòng)?
答:ATMS內(nèi)部維護(hù)已經(jīng)啟動(dòng)的相關(guān)進(jìn)程秋泳,通過(guò)processName(一般為包名)和UUID去查找是否已經(jīng)存在潦闲。 如何創(chuàng)建新的進(jìn)程?
答:通過(guò)Zygote進(jìn)程迫皱,調(diào)用fork方法新建對(duì)應(yīng)進(jìn)程歉闰,并返回新進(jìn)程的pid。 【Zygote fork進(jìn)程】
(4)舍杜、創(chuàng)建進(jìn)程時(shí)新娜,會(huì)通過(guò)反射調(diào)用ActivityThread的main方法,創(chuàng)建新的ActivityThread既绩。在main方法中創(chuàng)建了主線(xiàn)程的Looper對(duì)象概龄,并開(kāi)始loop循環(huán)。
【ActivityThread main:
1饲握、attach;2私杜、handleBindApplication;3、attachBaseContext;4救欧、installContentProviders;5衰粹、Application
onCreate】
(5)、在A(yíng)ctivityThread的main方法中通過(guò)bindApplication啟動(dòng)Application 【ActivityThread loop】
(6)笆怠、啟動(dòng)Application后會(huì)創(chuàng)建上下文context铝耻,并啟動(dòng)Activity。 【Activity 進(jìn)入生命周期】

3蹬刷、啟動(dòng)優(yōu)化:

(1)瓢捉、閃屏頁(yè)優(yōu)化
(2)、MultiDex優(yōu)化
(3)办成、第三方庫(kù)懶加載
(4)泡态、WebView優(yōu)化
(5)、線(xiàn)程優(yōu)化
(6)迂卢、系統(tǒng)調(diào)用優(yōu)化

思考:MultiDex.install的原理某弦?
答:MUltiDex.install 調(diào)用了doInstallation()方法桐汤。 主要步驟有: 1、獲取加載dex的classloader; 2靶壮、清除舊dex文件目錄怔毛; 3、創(chuàng)建新的dex文件目錄腾降;
4馆截、獲取所有dex文件; 5蜂莉、通過(guò)反射將所有dex文件寫(xiě)入dexElements中 6、通過(guò)classloader加載dexElements中所有的dex文件

相關(guān)資料文章:
女兒拿著小天才電話(huà)手表問(wèn)我App啟動(dòng)流程
今日頭條啟動(dòng)優(yōu)化

五.Service相關(guān)

-基礎(chǔ)定義:Service是一個(gè)在后臺(tái)執(zhí)行長(zhǎng)時(shí)間運(yùn)行操作而不用提供用戶(hù)界面的應(yīng)用組件混卵,可由其他組件啟動(dòng)映穗,即使用戶(hù)切換到其他應(yīng)用程序,Service 仍然在后臺(tái)繼續(xù)運(yùn)行幕随。

1蚁滋、Service兩種啟動(dòng)方式

startService: onCreate()>>onStartCommand()>>onDestroy()
調(diào)用stopService(intent)停止service。一旦服務(wù)開(kāi)啟赘淮,其生命周期與調(diào)用者無(wú)關(guān)辕录,調(diào)用者不能調(diào)用service中的方法。

bindService: onCreate()>>onBind()>>onUnbind()>>onDestroy()
調(diào)用unbindService(serviceConnection)停止service梢卸。生命周期與調(diào)用者綁定走诞,多個(gè)組件和Service綁定時(shí),當(dāng)所有組件銷(xiāo)毀時(shí)Service才會(huì)停止蛤高。

2蚣旱、Service注冊(cè)

在A(yíng)ndroidManifest.xml文件中使用<Service>節(jié)點(diǎn)進(jìn)行注冊(cè)。使用android:exported屬性設(shè)置 是否運(yùn)行外部應(yīng)用獲取 戴陡。

3塞绿、如何調(diào)用服務(wù)里面的方法

bind方式啟動(dòng)時(shí): 在服務(wù)類(lèi)內(nèi)部創(chuàng)建一個(gè)內(nèi)部類(lèi),可以間接調(diào)用服務(wù)中的方法 實(shí)現(xiàn)onbind方法恤批,返回的就是這個(gè)內(nèi)部類(lèi) 在activity中綁定service bindService(intent,serviceConnection,_)
在綁定成功的回調(diào)onServiceConnection中會(huì)傳遞一個(gè)IBinder對(duì)象 強(qiáng)制類(lèi)型轉(zhuǎn)換為自定義的接口類(lèi)型异吻,調(diào)用接口里面的方法 start方式啟動(dòng)時(shí):
通過(guò)Bundle攜帶參數(shù)。在service類(lèi)中的onStartCommand方法中接收喜庞,通過(guò)接收bundle攜帶的參數(shù)判斷調(diào)用方法诀浪。

4、intentService (Android 8.0 推薦使用JobIntentService)

intentService可以看作是service和handlerThread的結(jié)合赋荆,在完成任務(wù)后會(huì)自動(dòng)停止笋妥,intentService是繼承自service處理異步請(qǐng)求的一個(gè)類(lèi),在內(nèi)部有一個(gè)工作線(xiàn)程來(lái)處理耗時(shí)操作窄潭。 完成任務(wù)后會(huì)自動(dòng)停止不需要手動(dòng)停止春宣。
如果啟動(dòng)多次酵颁,每一個(gè)耗時(shí)操作會(huì)以工作隊(duì)列的方式在intentService的onHandlerIntent回調(diào)中執(zhí)行。

5月帝、前臺(tái)服務(wù)

  • 定義:前臺(tái)服務(wù)是用戶(hù)認(rèn)可的且在系統(tǒng)內(nèi)存不足時(shí)不允許系統(tǒng)銷(xiāo)毀的服務(wù)躏惋,運(yùn)行的優(yōu)先級(jí)比普通后臺(tái)服務(wù)高。

6嚷辅、保證Service不被后臺(tái)銷(xiāo)毀

(1)在onStartCommand方法中返回 START_STICKY

    @Override
    public int onStartCommand(Intent intent,int flags,int startId){
        flags =  START_STICKY;
        retrun super.onStartCommand(intent,flags,startId);
    }

(2)通過(guò)前臺(tái)服務(wù)來(lái)提升Service的優(yōu)先級(jí)

 @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand: ");
        Notification.Builder builder = new Notification.Builder(this.getApplicationContext());
        Intent intent1 = new Intent(this, MainActivity.class);
        builder.setContentIntent(PendingIntent.getActivity(this, 0, intent1, 0))
                .setLargeIcon(BitmapFactory.decodeResource(this.getResources(), R.mipmap.ic_launcher))
                .setContentTitle("測(cè)試ContentTitle")
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentText("測(cè)試ContentText")
                .setWhen(System.currentTimeMillis());

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel("CHANNEL_ONE_ID", "CHANNEL_ONE_NAME", NotificationManager.IMPORTANCE_MIN);
            channel.enableLights(false);
            channel.setShowBadge(false);
            channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
            NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            manager.createNotificationChannel(channel);
            builder.setChannelId("CHANNEL_ONE_ID");
        }
        Notification notification = builder.build();
        notification.defaults = Notification.DEFAULT_SOUND;

        startForeground(100, notification);
        return super.onStartCommand(intent, flags, startId);
    }

(3)在onDestroy中發(fā)送廣播重新啟動(dòng)service

相關(guān)資料文章:
Android Service兩種啟動(dòng)方式的區(qū)別
Android Service和IntentService知識(shí)點(diǎn)詳細(xì)總結(jié)

Android Service體系圖

六.Broadcast Receiver

BroadCastReceiver是對(duì)發(fā)送出來(lái)的broadcast進(jìn)行過(guò)濾簿姨、接收和響應(yīng)的組件。在執(zhí)行完onReceiver()方法后簸搞,生命周期結(jié)束扁位。

1、類(lèi)型

標(biāo)準(zhǔn)廣播:sendBroadcast()發(fā)送趁俊,完全異步執(zhí)行域仇,所有廣播幾乎在同一時(shí)間接收到,沒(méi)有先后順序寺擂,效率高暇务,無(wú)法被截?cái)?/p>

有序廣播:sendOrderedBroadcast()發(fā)送,同步執(zhí)行怔软,同一時(shí)間只有一個(gè)廣播接收器接收到這個(gè)消息垦细,有先后順序,如果消息被截?cái)嗟脖疲敲春竺娴膹V播接收器就無(wú)法接收到這條消息

2括改、注冊(cè)

靜態(tài)注冊(cè): 在manifest.xml文件中進(jìn)行注冊(cè),使用<<receiver>>聲明家坎,并在標(biāo)簽內(nèi)用<<intent-filter>>配置過(guò)濾器叹谁。 這種形式的廣播接收器生命周期伴隨著整個(gè)應(yīng)用。
優(yōu)先級(jí)由<<intent-filter>>中priority決定乘盖,數(shù)值越到優(yōu)先級(jí)越高焰檩。


   <receiver android:name=".MyBroadcastReceiver">
       <intent-filter android:proiorty="100">
           <action android:name=""/>
       </intent-filter>
   </receiver>

動(dòng)態(tài)注冊(cè): 在代碼中定義并設(shè)置好一個(gè)IntentFilter對(duì)象。調(diào)用registerReceiver()進(jìn)行注冊(cè)订框。

-區(qū)別:
1析苫、動(dòng)態(tài)廣播的系統(tǒng)優(yōu)先級(jí)比靜態(tài)廣播高;
2穿扳、靜態(tài)廣播的生存周期比動(dòng)態(tài)廣播長(zhǎng)衩侥。可用于監(jiān)聽(tīng)手機(jī)電量低矛物、手機(jī)開(kāi)機(jī)等茫死。

3、LocalBroadcastReceiver\LocalBroadcastManager

系統(tǒng)廣播:可用于應(yīng)用間履羞、應(yīng)用與系統(tǒng)間峦萎、應(yīng)用內(nèi)部的廣播接收屡久。
本地廣播:只有應(yīng)用內(nèi)部的廣播才能接收到。LocalBroadcastManager對(duì)本地廣播進(jìn)行注冊(cè)和發(fā)送爱榔。

localBroadManager.sendBroadcast();
localBroadManager.register()

相關(guān)資料文章:
Android之BroadcastReceiver總結(jié)

七.Content Provider

1被环、定義&作用

內(nèi)容提供器是用于不同程序之間共享數(shù)據(jù)的功能,它提供了一套完整的機(jī)制详幽。允許一個(gè)程序訪(fǎng)問(wèn)另一個(gè)程序的數(shù)據(jù)筛欢,同時(shí)保證被訪(fǎng)問(wèn)數(shù)據(jù)安全性。
其為數(shù)據(jù)存儲(chǔ)和讀取提供了統(tǒng)一的接口唇聘,使用表的形式對(duì)數(shù)據(jù)進(jìn)行封裝版姑。

2、種類(lèi)

3迟郎、使用

通過(guò)URI(uniform resource identifier 統(tǒng)一資源標(biāo)識(shí)符)訪(fǎng)問(wèn)對(duì)應(yīng)ContentProvider漠酿。

外部進(jìn)程通過(guò)ContentResolver訪(fǎng)問(wèn)對(duì)應(yīng)ContentProvider。


    ContentResolver resolver  = getContentResolver();
    
    Uri uri = Uri.parse("content://com.demo.myprovider/user");
    
    Cursor cursor = resolver.query(uri,null,null,null,"userid desc");

4谎亩、原理

android中binder原理

相關(guān)資料文章:
關(guān)于ContentProvider的知識(shí)都在這里了!
四大組件-Content Provider詳解

八.Intent相關(guān)

1宇姚、定義

Intent意圖:是一個(gè)消息傳遞對(duì)象匈庭,可以通過(guò)它攜帶數(shù)據(jù),來(lái)向其它組件發(fā)起請(qǐng)求操作浑劳。例如:?jiǎn)?dòng)Activity阱持、啟動(dòng)或者綁定Service、發(fā)送廣播等魔熏。

2衷咽、分類(lèi)

顯示意圖:直接指定調(diào)用組件的名稱(chēng),一般用于應(yīng)用內(nèi)部蒜绽。
打開(kāi)內(nèi)部activity、啟動(dòng)or綁定Service、發(fā)送廣播
隱示意圖:沒(méi)有指定組件的名稱(chēng)查库,而是聲明action行為屠缭,從而允許其它應(yīng)用的組件來(lái)處理。
打開(kāi)撥號(hào)界面\打開(kāi)指定網(wǎng)頁(yè)

    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.setData(Uri.parse("tel:123456789"));  // intent.setData(Uri.parse("www.baidu.com"));
    startActivity(intent);

3相赁、intent-filter

(1)相寇、<action>:指定組件要完成的操作,系統(tǒng)內(nèi)置:MAIN钮科、VIEW唤衫、SEND等等。
(2)绵脯、<category>:為action增加額外的附加類(lèi)別信息佳励,常見(jiàn)有:DEFAULT休里、LAUNCHER等。
(3)植兰、<data>&<type>:為action提供要操作的數(shù)據(jù)份帐。

    
    <activity android:name = ".view.ShareActivity">
        <intent-filter>
            <action android:name = "android.intent.action.SEND"/>
            <category android:name = "android.intent.category.DEFAULT"/>
            <data android:mineType = "text/plain"/>
        </intent-filter>
    </activity>

相關(guān)資料文章:
Android 基礎(chǔ)知識(shí)5:Intent 和 Intent 過(guò)濾器

九.網(wǎng)絡(luò)編程相關(guān)

1、網(wǎng)絡(luò)基礎(chǔ)

網(wǎng)絡(luò)體系結(jié)構(gòu)分層 TCP/IP模型 :(自上往下)
應(yīng)用層(HTTP楣导、FTP废境、DNS、SMTP等等)
運(yùn)輸層(TCP筒繁、UDP)
網(wǎng)絡(luò)層(IP)
數(shù)據(jù)鏈路層(ARP)
物理層

(1)噩凹、應(yīng)用層:如Http協(xié)議,它實(shí)際定義了如何包裝和解析數(shù)據(jù)毡咏,應(yīng)用層采用HTTP協(xié)議后驮宴,會(huì)按照協(xié)議包裝數(shù)據(jù),如按照請(qǐng)求行呕缭、請(qǐng)求頭堵泽、請(qǐng)求體包裝。
包裝好后將數(shù)據(jù)傳輸至運(yùn)輸層恢总。
(2)迎罗、運(yùn)輸層:這一層指定了將數(shù)據(jù)以何種方式傳送到端口號(hào)。涉及到如何建立連接片仿?如何保證數(shù)據(jù)不丟失纹安?如何調(diào)節(jié)流量控制和擁塞控制?等砂豌。
(3)厢岂、網(wǎng)絡(luò)層:這一層指定了將數(shù)據(jù)傳送到那個(gè)IP地址。涉及到最優(yōu)路線(xiàn)阳距,路由選擇算法等塔粒。
(4)、數(shù)據(jù)鏈路層:如ARP協(xié)議筐摘,負(fù)責(zé)把IP地址解析成對(duì)應(yīng)的MAC地址窗怒,即硬件地址,這樣就能找到對(duì)應(yīng)的唯一機(jī)器蓄拣。
(5)扬虚、物理層:提供二進(jìn)制傳輸服務(wù),也就是真正開(kāi)始通過(guò)傳輸介質(zhì)(有線(xiàn)球恤、無(wú)線(xiàn))開(kāi)始進(jìn)行數(shù)據(jù)的傳輸了辜昵。

2、Http & Https

(1)咽斧、無(wú)連接:Http約定了每次連接只處理一個(gè)請(qǐng)求堪置,一次請(qǐng)求完成后就斷開(kāi)連接躬存。主要是為了緩解服務(wù)器的壓力,減少資源占用舀锨。
(2)岭洲、無(wú)狀態(tài):每個(gè)請(qǐng)求之間都是獨(dú)立的,對(duì)于之前的請(qǐng)求事務(wù)沒(méi)有記憶的能力坎匿。
(3)盾剩、HTTP緩存:主要通過(guò)Header中的Cache-Control和ETag來(lái)實(shí)現(xiàn)。
Cache-Control: private\public\max-age\no-cache\no-store
ETag:即用來(lái)進(jìn)行對(duì)比緩存替蔬,ETag是服務(wù)端資源的一個(gè)標(biāo)識(shí)碼
(4)告私、對(duì)稱(chēng)加密:客戶(hù)端和服務(wù)端雙方統(tǒng)一采用一個(gè)密鑰進(jìn)行加密解密。
(5)承桥、非對(duì)稱(chēng)加密:公鑰加密的信息只能用私鑰解開(kāi)驻粟,私鑰加密的信息只能被公鑰解開(kāi)。只有服務(wù)端存在私鑰凶异,公鑰傳遞給客戶(hù)端蜀撑。
(6)、HTTPS:即http + ssl 剩彬,采用了非對(duì)稱(chēng)加密的方式包裝數(shù)據(jù)酷麦。
(7)、Keep-Alive模式:又稱(chēng)為持久連接襟衰、連接重用。使客戶(hù)端到服務(wù)端的連接持續(xù)有效粪摘,當(dāng)出現(xiàn)后續(xù)請(qǐng)求后不用再次建立連接瀑晒。

客戶(hù)端與服務(wù)端通信流程
(1)客戶(hù)端發(fā)送https請(qǐng)求
(2)服務(wù)端配置一套證書(shū)(相當(dāng)于公鑰和私鑰)。收到請(qǐng)求后向客戶(hù)端發(fā)送證書(shū)(公鑰)徘意。
(3)客戶(hù)端收到證書(shū)后驗(yàn)證是否有效.驗(yàn)證完畢后苔悦,產(chǎn)生一個(gè)隨機(jī)值,利用證書(shū)對(duì)隨機(jī)值加密后向服務(wù)端發(fā)送
(4)服務(wù)端收到加密數(shù)據(jù)后利用證書(shū)(私鑰)解密(這里非對(duì)稱(chēng)加密過(guò)程完成)椎咧。拿到隨機(jī)數(shù)后作為密鑰玖详,通過(guò)密鑰加密數(shù)據(jù)后向客戶(hù)端發(fā)送。
(5)客戶(hù)端收到數(shù)據(jù)后也用隨機(jī)值作為密鑰進(jìn)行解密數(shù)據(jù)(這里是對(duì)稱(chēng)加密)

3勤讽、Socket

  • Socket簡(jiǎn)單介紹
    • Socket就是為網(wǎng)絡(luò)服務(wù)提供的一種機(jī)制
    • 通信的兩端都有Socket
    • 網(wǎng)絡(luò)通信其實(shí)就是Socket間的通信
    • 數(shù)據(jù)在兩個(gè)Socket間通過(guò)IO傳輸
    • 玩Socket主要就是記住流程蟋座,代碼查文檔就行
    • Socket的簡(jiǎn)單使用的話(huà)應(yīng)該都會(huì),兩個(gè)端各建立一個(gè)Socket脚牍,服務(wù)端的叫ServerSocket向臀,然后建立連接即可。

4诸狭、TCP & UDP

TCP:1券膀、必須建立連接君纫,形成傳輸數(shù)據(jù)的通道。
2芹彬、在連接中可進(jìn)行大量數(shù)據(jù)的傳輸蓄髓。
3、通過(guò)三次握手完成連接舒帮,是可靠協(xié)議会喝。
4、必須建立連接会前,效率低好乐。

UDP:1、面向無(wú)連接
2瓦宜、每個(gè)數(shù)據(jù)包大小在64k以?xún)?nèi)
3蔚万、無(wú)需建立連接,是不可靠協(xié)議
4临庇、效率高

5反璃、三次握手、四次揮手

三次握手流程:
(1)假夺、客戶(hù)端 發(fā)送SYN = 1 Seq = X 表示請(qǐng)求建立連接淮蜈,Seq = X 是客戶(hù)端生成的隨機(jī)數(shù);
(2)、服務(wù)端 收到請(qǐng)求后已卷,發(fā)送 SYN = 1 ACK = X+1 Seq = Y 表示回復(fù)客戶(hù)端建立連接的請(qǐng)求梧田,Seq = Y 是服務(wù)端生成的隨機(jī)數(shù);
(3)侧蘸、客戶(hù)端 收到回復(fù)后裁眯,再次發(fā)送 ACK = Y + 1 Seq = Z


三次握手流程

思考:為什么需要三次握手?
答:前兩次握手是建立一個(gè)連接必須的讳癌。第三次握手是為了防止已經(jīng)失效的連接請(qǐng)求報(bào)文段突然又傳到服務(wù)端穿稳,因而產(chǎn)生錯(cuò)誤

四次揮手流程:
(1)、客戶(hù)端 發(fā)送FIN = 1 ACK = Z Seq = X
(2)晌坤、服務(wù)端 收到后回復(fù) ACK = X + 1 Seq = Z
(3)逢艘、服務(wù)端 發(fā)送FIN = 1 ACK = X Seq = Y
(4)、客戶(hù)端 收到后回復(fù) ACK = Y Seq = X


四次揮手流程

思考:為什么需要四次揮手骤菠?
答:第2 ACK回復(fù)消息 和 第3 FIN終止消息并不是同時(shí)發(fā)出它改,先發(fā)送回復(fù)ACK再發(fā)送FIN終止消息。這也很好理解商乎,當(dāng)客戶(hù)端要求斷開(kāi)連接時(shí)搔课,此時(shí)服務(wù)端可能還有未發(fā)送完的數(shù)據(jù),
所以先ACK,然后等數(shù)據(jù)發(fā)送完再FIN爬泥。這樣就變成了四次握手了柬讨。

相關(guān)資料文章:
HTTPS和HTTP的區(qū)別
Android技能樹(shù) — 網(wǎng)絡(luò)小結(jié)(3)之HTTP/HTTPS

十.事件分發(fā)機(jī)制

思考:當(dāng)發(fā)生手指觸摸、點(diǎn)擊袍啡、移動(dòng)等事件時(shí)踩官,這些事件是如何被轉(zhuǎn)換成手機(jī)系統(tǒng)可識(shí)別的代碼事件(event)? 這個(gè)過(guò)程中有那些系統(tǒng)組件參與?
答:(1)-首先境输,在A(yíng)ndroid系統(tǒng)中將所有的輸入事件定義為InputEvent蔗牡,根據(jù)輸入類(lèi)型又進(jìn)一步分為KeyEvent(鍵盤(pán)輸入事件) 和 MotionEvent(屏幕觸摸事件)
-硬件接收到事件后,通過(guò)InputManager進(jìn)行識(shí)別嗅剖,并通過(guò)ViewRootImpl將事件分發(fā)給當(dāng)前激活的窗口辩越。
-在應(yīng)用窗口中有對(duì)應(yīng)的PhoneWindow\DecorView實(shí)例,它們通過(guò)與InputManagerService通信來(lái)接收分發(fā)的事件信粮。
(2)參與的系統(tǒng)組件有:SystemServer黔攒、WindowManager、InputManager等强缘。

-InputEvent:輸入事件督惰。根據(jù)類(lèi)型又可劃分為KeyEvent和MotionEvent
-SystemServer:系統(tǒng)服務(wù)。由Zygote進(jìn)程對(duì)齊進(jìn)行初始化旅掂。SystemServer啟動(dòng)后對(duì)AMS赏胚、WMS、PMS等關(guān)鍵服務(wù)進(jìn)行初始化商虐。
-WindowManagerService:窗口管理服務(wù)觉阅。管理窗口添加、移除等操作秘车。對(duì)InputManagerService初始化典勇。
-InputManagerService:輸入管理服務(wù)。啟動(dòng)了InputManager輸入管理器鲫尊。
-InputManager:輸入管理器痴柔。與硬件交互識(shí)別轉(zhuǎn)換輸入事件沦偎。
-ViewRootImpl:作為整個(gè)控件樹(shù)的根部疫向,它是View樹(shù)正常運(yùn)作的動(dòng)力所在,控件的測(cè)量豪嚎、布局搔驼、繪制以及輸入事件的分發(fā)都由ViewRootImpl控制。
ViewRootImpl作為鏈接WindowManager和DecorView的紐帶侈询,同時(shí)實(shí)現(xiàn)了ViewParent接口舌涨。

思考:代碼事件是如何被分發(fā)?被處理扔字?被攔截等囊嘉?
答:Android系統(tǒng)的事件分發(fā)使用了遞歸傳遞的思想温技,通過(guò)責(zé)任鏈的方式將事件自頂向下傳遞,找到事件的消費(fèi)者后扭粱,再自低向上返回結(jié)果舵鳞。

由外到內(nèi)傳遞,由內(nèi)到外處理
事件傳遞:Activity>>ViewGroup>>View

三個(gè)重要的方法:
dispatchTouchEvent :分發(fā)事件
onInterceptTouchEvent:攔截事件
onTouchEvent:處理事件
1.當(dāng)onInterceptTouchEvent返回ture時(shí)琢蛤,若onTouchEvent返回true蜓堕,后續(xù)事件將不再經(jīng)過(guò)該ViewGroup的onInterceptTouchEvent方法,直接交由該ViewGroup的onTouchEvent方法處理博其;若onTouchEvent方法返回false套才,后續(xù)事件都將交由父ViewGroup處理,不再經(jīng)過(guò)該ViewGroup的onInterceptTouchEvent方法和onTouchEvent方法慕淡。
2.當(dāng)onInterceptTouchEvent返回false時(shí)背伴,事件繼續(xù)向子View分發(fā);
3.對(duì)于子View儡率,當(dāng)onTouchEvent返回true挂据,父ViewGroup派發(fā)過(guò)來(lái)的touch事件已被該View消費(fèi),后續(xù)事件不會(huì)再向上傳遞給父ViewGroup儿普,后續(xù)的touch事件都將繼續(xù)傳遞給子View崎逃。
4.對(duì)于子View,onTouchEvent返回false眉孩,表明該View并不消費(fèi)父ViewGroup傳遞來(lái)的down事件个绍,而是向上傳遞給父ViewGroup來(lái)處理;后續(xù)的move浪汪、up等事件將不再傳遞給該View巴柿,直接由父ViewGroup處理掉。
5.onTouch先于onTouchEvent調(diào)用死遭,onClick事件是在onTouchEvent中ACTION_UP中觸發(fā)的广恢。

事件分發(fā)序列:
針對(duì)MotionEvent添加了一個(gè)Action以描述該事件的行為。
·ACTION_DOWN:手指觸摸到屏幕
·ACTION_MOVE:手指在屏幕上移動(dòng)
·ACTION_UP:手指離開(kāi)屏幕
·其它ACTION_CANCEL...

當(dāng)用戶(hù)發(fā)生一次觸摸屏幕的事件時(shí)呀潭,必然會(huì)產(chǎn)生一個(gè)事件序列钉迷,例如:ACTION_DOWN、ACTION_MOVE....ACTION_MOVE钠署、ACTION_UP糠聪。其中ACTION_MOVE發(fā)生的次數(shù)不確定為0到n,
但是ACTION_DOWN和ACTION_UP發(fā)生次數(shù)則為1谐鼎。當(dāng)ACTION_DOWN事件從ViewGroup中分發(fā)到消費(fèi)事件的子View中時(shí)舰蟆,ViewGroup會(huì)保存該消費(fèi)View,后續(xù)發(fā)生的ACTION_MOVE、ACTION_UP會(huì)直接跳過(guò)遞歸
將后續(xù)事件直接傳遞給保存的子View身害。

相關(guān)資料文章:
反思|Android 事件分發(fā)機(jī)制的設(shè)計(jì)與實(shí)現(xiàn)
關(guān)于反思系列(Thinking in Android)
淺談Android事件分發(fā)機(jī)制
Android事件分發(fā)機(jī)制完全解析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末味悄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子塌鸯,更是在濱河造成了極大的恐慌傍菇,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件界赔,死亡現(xiàn)場(chǎng)離奇詭異丢习,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)淮悼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)咐低,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人袜腥,你說(shuō)我怎么就攤上這事见擦。” “怎么了羹令?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵鲤屡,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我福侈,道長(zhǎng)酒来,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任肪凛,我火速辦了婚禮堰汉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘伟墙。我一直安慰自己翘鸭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布戳葵。 她就那樣靜靜地躺著就乓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拱烁。 梳的紋絲不亂的頭發(fā)上生蚁,一...
    開(kāi)封第一講書(shū)人閱讀 52,394評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音邻梆,去河邊找鬼守伸。 笑死绎秒,一個(gè)胖子當(dāng)著我的面吹牛浦妄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼剂娄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蠢涝!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起阅懦,我...
    開(kāi)封第一講書(shū)人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤和二,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后耳胎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體惯吕,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年怕午,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了废登。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡郁惜,死狀恐怖堡距,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情兆蕉,我是刑警寧澤羽戒,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站虎韵,受9級(jí)特大地震影響易稠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜包蓝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一缩多、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧养晋,春花似錦衬吆、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至零酪,卻和暖如春冒嫡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背四苇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工孝凌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人月腋。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓蟀架,卻偏偏與公主長(zhǎng)得像瓣赂,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子片拍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

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