當前位置:首頁 » 安卓系統 » android集合存儲

android集合存儲

發布時間: 2023-08-04 05:58:06

『壹』 安卓內外部存儲完全解析 -- 別再弄混了

安卓開發離不開手機存儲,然而大部分人對於安卓開發中的存儲概念存在誤區,內部外部SD卡傻傻分不清?

以下引用來自對 官方文檔 的理解

呵呵呵,先別說話,然而重點來了(敲黑板),按照官方的說法,

內部存儲是指系統的存儲空間,沒有root是訪問不到的呦親,比如sharedPreferenced或者database都是保存在這裡面的。

外部存儲,又分為 2 部分:

然而現實中,常常有同事把手機那個32G,64G存儲叫做內部存儲= =,寶寶好累,人家明明是 ExternalStorage !!

希望本篇能讓大家對內外部存儲有一個正確鮮明的認識

getFilesDir()

路徑如下

文檔 雲:若想操作該路徑,你需要一個輸出流:

就像這樣:

注: this 是 context 對象

路徑下會看到新文件哦

如果你還想讀取的話, 文檔 雲:你需要一個輸入流:

Log如下

getCacheDir()

文檔 雲:

路徑如下:

特別的,還有getDir() :

getDir("- -!.txt", Context.MODE_PRIVATE).getAbsolutePath()

路徑如下:

app_是系統自己加上去的

內部存儲就是系統的存儲,沒有root你是看不到的,內部存儲最大特點就是可以用Context對象調用各個獲取路徑的方法。比如: context.fileList()
那就是

下的文件遍歷。

而 deleteFile("ABC") 就是

刪除下名為 ABC 的文件
</br></br></br>

操作外部存儲你首先需要以下許可權

當你申請了write許可權,那麼read許可權默認也就通過啦

再判斷狀態:

if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState))

Environment.getExternalStorageDirectory()

這個路徑根據手機廠家不同會有些許變化

直接傳入 Environment 中的常量獲取相應的路徑,如下:

Environment.(Environment.DIRECTORY_ALARMS));

或者

Environment.(Environment.DIRECTORY_PICTURES));

公有目錄下,系統會區分不同類別 (例如鈴聲在系統設置中顯示為鈴聲而不是音樂)

4.4以後訪問該目錄不再需要許可權了

getExternalFilesDir(String type)

eg.
getExternalFilesDir(Environment.DIRECTORY_MUSIC)

特別的:ContextCompat下的

ContextCompat.getExternalFilesDirs(context,type)

返回一個File[],在4.4以後第一條數據默認外部主存儲目錄,第二條數據就是sd卡路徑啦,但是注意4.4之前是沒有第二條數據的哦

該目錄下的特點是卸載程序後,該目錄和其下所有文件均會被刪除

getExternalCacheDir()

注意,使用該目錄注意管理空間,你不能等系統幫你清理,而是自己清理不再需要的緩存

特別的:ContextCompat下的

ContextCompat.getExternalCacheDirs()

道理同上

發現特點了嗎朋友,無論外部內部,只有路徑中有包名,那麼就是私有的,而且是隨著程序的卸載而被刪除的, 有包名的路徑均是Context中的方法,而公有的路徑均是Environment調用的

這個貨真真是要了老命,一般的方法根部不好使,結合網上有的方法加上公司項目中的方法,總結如下:

百分百好用的獲取SD卡路徑方法:

最後集合 path 中的值就是SD卡根目錄

雖然無視版本百分百好用,但是如果你的手機有SD卡槽卻沒插SD卡,該方法最後 path 返回的是 null ,也就是說該方法無法判斷到底是沒插SD卡還是根本不支持SD卡

其實還有一種方法

String path = System.getenv("SECONDARY_STORAGE");

該方法只要你手機支持SD卡,無論你插沒插SD卡,均會返回SD卡路徑,但是 6.0及以上該方法被移除

Environment中源碼其實就是根據這個方法獲取路徑的

安卓官方文檔大家一定要看,他就是我們開發者的權威呀,聖經呀!!

『貳』 Android開發中 Activity中數據、狀態的保存

首先指出你這里的一個錯誤,你定義的是一個List<String>,看你的用法,你不是很清楚List和HashMap之間的區別,List是個有序集合,添加的時候不是用put,是用add;HashMap是個無需的鍵值對存儲,添加的時候用put。

另外,保存數組集合有N種方法,你可以單例一個application,就像一個實體類一樣,裡面存放你需要的任意變數(數組,集合),實現get和set方法,這樣的變數,你是可以再任何activity裡面去調用、賦值的;也可以定義一個靜態集合,來實現數組內容保存;還有其他本地的SharedPreference、file、SD卡等就不說了,都是可以實現的。
那麼就說你的這個問題,最簡單的方法就是在全局的Application中定義一個集合,保存你的數據內容,在activity1的onResume去判斷ListView 的adapter裡面是否還有數據顯示,沒有就讀取出來顯示。還有一點我很奇怪,為什麼一個ListView點擊Item跳轉,回來後會數據全沒了?這個如果你中間沒有其他操作是不應該有這種現象的。

『叄』 用 Kotlin 寫 Android 3—數組,集合與字元串

相比 Java,在 Kotlin 里數組的寫法變化還是挺大的,用 xx-Array 的命名規則來聲明一個數組類型,並用 xx-ArrayOf 來進行初始化。

例如整型數組,IntArray 類型,IntArrayOf 是初始化方法,以此類推其他基礎類型也差不多。

要注意的是,String 類型的數組聲明有所不同,Array<String> 表示一個字元串數組,arrayOf 是初始化方法。由此也可以得出,像我們自己定義的一些模型類要是想聲明一個數組應該是和 String 一個用法。

雖說數組的聲明寫法上有差別,但在數組元素的基本使用上可以說相差不大。

Kotlin 里的容器類分三大類,並且每個類又分為不可修改和可修改兩種,這就好比 val 和 var 的變數聲明一樣。默認情況是不可修改的,要想對容器類進行類似增,刪,改的操作就要聲明可修改,即要加上前綴 Mutable-。和數組初始化方法類似,容器類的初始化方法也是 xx-Of 系列,xx 表示具體容器類型,例如如果是可變集合初始化那就是 MutableSetOf。

遍歷

三者都能進行 for-in 循環,

三者都能進行迭代器循環遍歷,

除此之外三者還能進行 forEach 循環遍歷,不過對 Map 來說有 API 24 的版本限制,其次雖說寫法簡單,但可能實用性不那麼強,畢竟實際開發中不會說僅做個簡單遍歷吧。所以我覺得記住上面兩種較通用的寫法就夠了。

字元串的常規方法沒有太大的改變,我們依然可以用 indexOf, subString, replace, split 等方法。對於類型轉換,Kotlin 中的字元串提供了 to-xxx 系列的方法,例如字元串轉整型 toInt,字元串轉浮點型 toFloat 等。

另外一個就是 Kotlin 里用 ${} 替換了 Java 中的 String.format 來用於字元串模板效果。

熱點內容
apachemodpython 發布:2025-02-04 12:33:53 瀏覽:671
linuxphp安裝mysql 發布:2025-02-04 12:32:55 瀏覽:148
小米手機怎麼擴大配置 發布:2025-02-04 12:27:34 瀏覽:980
金x五毒桃花安卓版哪裡有下載 發布:2025-02-04 12:27:29 瀏覽:483
思快四編程 發布:2025-02-04 12:15:35 瀏覽:134
安卓手機哪個日歷好用無廣告 發布:2025-02-04 12:15:32 瀏覽:935
伺服器動態ip啟動程序 發布:2025-02-04 11:58:10 瀏覽:154
怎麼自己開個我的世界伺服器地址 發布:2025-02-04 11:51:44 瀏覽:810
整數是數存儲 發布:2025-02-04 11:39:44 瀏覽:694
12123六位密碼是多少 發布:2025-02-04 11:34:43 瀏覽:799