閒着空閒時間看看Activity源代碼的實現以及各個方法
Activity拋去註釋基本上大約有6000多行的代碼,350多種方法,97種屬性,還有4個內部類 倆個接口
首先繼承ContextThemeWrapper
看註釋意思:主要是用來設置主題的一個類。然後繼續繼承ContextWrapper
看到這就明白了,原來Activity最底層是Context,是用來展示上下文的。
註釋意思:應用程序環境的全局信息接口。這是一個抽象類,它的實現由Android系統提供。它允許訪問特定於應用程序的資源和類,以及調用應用程序級操作,如啓動活動、廣播和接收意圖等。根據註釋瞭解到,四大組件其中三個都是以Context作爲基礎來實現的。先了解了解Context中類的方法及其使用。
剛進去就發現一個
操作文件的四種模式
操作本地緩存的四種枚舉
操作數據庫的五種枚舉
@hide 說明是隱藏類
@InDef 來代替枚舉 (https://blog.csdn.net/luoguopeng/article/details/72781080 借鑑)
@Retention 設置註解只保留在源文件,當Java文件編譯成class文件的時候,註解被遺棄;(https://blog.csdn.net/u010002184/article/details/79166478 借鑑)
看到一個東西非常熟悉 MODE_PRIVATE
Context.MODE_PRIVATE:爲默認操作模式,代表該文件是私有數據,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原文件的內容,如果想把新寫入的內容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式會檢查文件是否存在,存在就往文件追加內容,否則就創建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其他應用是否有權限讀寫該文件。
MODE_WORLD_READABLE:表示當前文件可以被其他應用讀取;
MODE_WORLD_WRITEABLE:表示當前文件可以被其他應用寫入。
例如:
FileOutputStream fos = openFileOutput("info1.txt", MODE_PRIVATE);
SharedPreferences settings= getSharedPreferences("setting", Context.MODE_PRIVATE);
但是我發現還有個枚舉
這個MODE_MULTI_PROCESS 一看表面意思多進程
根據度娘查到鏈接https://www.cnblogs.com/mengdd/p/5849201.html
原來本地緩存SharedPreferences是不支持多進程的,通過ContentProvider來實現多進程。具體實現查看鏈接
接下來繼續
原來是綁定服務的幾種方式,(我先大概瞭解每個類,然後再每一個細節處理)
用來註冊服務
下一個是一個方法
原來Context提供了Assets的接口 再往下看還有好幾個資源的接口
第一個很熟悉,獲取資源的時候都會用context.getResources().get一系列比如顏色,drawabel文件等等、
第二個
1、安裝,卸載應用
2、查詢permission相關信息
3、查詢Application相關信息(application,activity,receiver,service,provider及相應屬性等)
4、查詢已安裝應用
5、增加,刪除permission
6、清除用戶數據、緩存,代碼段等
第三個
getContentResolver()可以得到當前應用的 ContentResolver實例。ContentResolver提供的接口和ContentProvider中需要實現的接口對應
獲取主線程
獲取線程池,多線程處理相關
ApplicationContext:看註釋的意思
返回當前進程的單個全局應用程序對象的上下文。通常只有在需要生命週期與當前上下文分離的上下文(即與流程的生命週期相關聯,而不是與當前組件相關聯)時,才應該使用該上下文。說明
看使用的週期是否在activity週期內,如果超出,必須用application;常見的情景包括:AsyncTask,Thread,第三方庫初始化等等。
還有些情景,只能用activity:比如,對話框,各種View,需要startActivity的等。
getNextAutofillId不知道幹啥用的
註冊ComponentCallbacks
ComponentCallbacks (ComponentCallbacks 接口 : 應用組件的回調接口, 所有的組件都要實現這個接口;)
取消註冊ComponentCallbacks
看到這倆,原來設置字符串,獲取文本都是在context類裏實現
獲取顏色
獲取drawable文件
可根據顏色列表設置不同顏色的文本不同顏色,並且可以不用設置OnTouchListener 鏈接
https://blog.csdn.net/abc6368765/article/details/51482317
設置主題
https://blog.csdn.net/ff313976/article/details/7949614
類加載器
獲取包名
本地緩存
移除已經存在的preferences文件
將現有共享首選項文件從給定源存儲上下文移到此上下文。這通常用於在升級之後在存儲位置之間遷移數據,例如移動到設備保護的存儲器。
可以方便地再手機中創建文件,並返回文件輸出流,用於對文件做寫入操作
https://blog.csdn.net/u013365671/article/details/40678867
刪除文件
獲取文件流路徑
獲取本地緩存路徑
返回文件系統上存儲屬於此應用程序的所有私有文件的目錄的絕對路徑。應用程序不應該直接使用這個路徑;它們應該在這個類上使用{@link#getFilesDir()}、{@link#getCacheDir()}、{@link#getDir(String,int)}或其他存儲API。
https://www.jianshu.com/p/128f9dd34b05
用於獲取/data/data//files目錄
返回文件系統上目錄的絕對路徑,類似於{@link#getFilesDir()}。不同之處在於,放在這個目錄下的文件將不被自動備份到遠程存儲。有關Android中的自動備份機制的完整討論,請參見{@link android.app.backup.BackupAgent BackupAgent}。
這些是context前1000行代碼的方法,剛理解源碼肯定有很多錯誤之處,請大神多提點提點。