日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747


碼個(gè)蛋(codeegg)第 698 次推文

作者: SpannerBear

原文: https://juejin.im/post/5d2c36f5e51d4556db694aa3

Android/ target=_blank class=infotextkey>安卓碎片化的問(wèn)題,由來(lái)已久,這次來(lái)看一下文件儲(chǔ)存碎片化的問(wèn)題。到底要怎么去正確選擇和管理文件存儲(chǔ)呢?

為什么要管理文件?

Android手機(jī)一直以來(lái)被人詬病越用越卡,越用存儲(chǔ)空間越少,經(jīng)常有要靠各種清理App清理垃圾,到最后不得對(duì)手機(jī)進(jìn)行雙清,原因除了硬件老化和Android的底層實(shí)現(xiàn)問(wèn)題之外,開(kāi)發(fā)者對(duì)文件管理的忽視制造出大量無(wú)法清理的“垃圾”也是造成手機(jī)卡慢的原因之一。

Android的開(kāi)放性給了開(kāi)發(fā)者巨大的自由度,但自由不是讓我們?yōu)E用權(quán)限和隨意開(kāi)發(fā)的借口,每一個(gè)開(kāi)發(fā)者都應(yīng)該注重細(xì)節(jié),連曾經(jīng)一片混亂的第三方推送都開(kāi)始統(tǒng)一整合規(guī)范化了,如果你還在隨意開(kāi)發(fā),不如現(xiàn)在開(kāi)始,注重細(xì)節(jié),提高用戶的Android手機(jī)體驗(yàn)?

Android閃存

總所周知,Android手機(jī)存儲(chǔ)分為兩個(gè)部分:內(nèi)部存儲(chǔ)外部存儲(chǔ),內(nèi)部存儲(chǔ)一般是手機(jī)自帶的存儲(chǔ)空間,外部存儲(chǔ)指外插SD卡提供的存儲(chǔ)空間;隨著手機(jī)發(fā)展,這兩個(gè)存儲(chǔ)的定義又有了一些些變化,新的手機(jī)不再有外插SD卡的概念,采取了內(nèi)置閃存(eMMC、UFS等)的方式,所以內(nèi)部存儲(chǔ)和外部存儲(chǔ)在新的Android手機(jī)上已經(jīng)在同一個(gè)硬件上了。但為了兼容舊設(shè)備和讓用戶得到更好的體驗(yàn),我們?nèi)匀恍枰芾砗檬謾C(jī)上內(nèi)外存儲(chǔ)的使用。

關(guān)于文件存儲(chǔ)位置的api

做過(guò)文件相關(guān)管理的同學(xué)應(yīng)該都曾經(jīng)被android眾多的文件api搞得一片混亂過(guò),現(xiàn)在來(lái)理一理.我把應(yīng)用操作的文件存儲(chǔ)位置分為三個(gè)部分

  1. 應(yīng)用內(nèi)部存儲(chǔ)私有文件目錄

  2. 應(yīng)用外部存儲(chǔ)私有文件目錄

  3. 公有目錄

我們有兩種api去獲取這三個(gè)部分的存儲(chǔ)位置,它們分別歸屬于Context和Environment。

 

Context

Context是應(yīng)用的上下文,它用來(lái)獲取與應(yīng)用相關(guān)的文件目錄,可以獲取應(yīng)用私有和應(yīng)用公有目錄,常用的api有(后面是所對(duì)應(yīng)的路徑):

1. Context#getCacheDir /data/user/0/cn.appname.xxx/cache
2. Context#getDir("spanner",MODE_PRIVATE) /data/user/0/cn.appname.xxx/app_spanner
3. Context#getFileDir /data/user/0/cn.appname.xxx/files
3. Context#getExternalCacheDir /storage/emulated/0/Android/data/cn.appname.xxx/cache
4. Context#getExternalFilesDir(Environment.DIRECTORY_PICTURES) /storage/emulated/0/Android/data/cn.appname.xxx/files/Pictures
Context#getExternalFilesDir /storage/emulated/0/Android/data/cn.appname.xxx/files
5. Context#getExternalMediaDirs /storage/emulated/0/Android/media/cn.appname.xxx

前兩個(gè)是應(yīng)用內(nèi)部存儲(chǔ)私有目錄,后面4個(gè)都是應(yīng)用外部存儲(chǔ)私有文件目錄。注意:/data/user/0/ 等同于 /data/data/

Environment

Environment和應(yīng)用無(wú)關(guān),它用于獲取公有存儲(chǔ)位置的文件目錄,常用的api有:


 
1. Environment#getExternalStorageDirectory /storage/emulated/0
2. Environment#getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) /storage/emulated/0/DCIM
Environment#getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) /storage/emulated/0/Pictures
3. Environment#getDataDirectory /data
4. Environment#getDownloadCacheDirectory /data/cache
5. Environment#getRootDirectory /system
 

API的選用

 

到底什么時(shí)候要用什么api呢?

 

應(yīng)用私有文件目錄

應(yīng)用私有目錄由Context獲取控制,分為內(nèi)部存儲(chǔ)外部存儲(chǔ),內(nèi)部存儲(chǔ)不需要申請(qǐng)文件讀寫權(quán)限也能夠使用,外部存儲(chǔ)需要權(quán)限(getetExternalCacheDir 和 getExternalFilesDir 這兩個(gè)方法從4.4之后不再需要讀寫權(quán)限)。用戶對(duì)app進(jìn)行數(shù)據(jù)清理或卸載可以清理外部存儲(chǔ)和內(nèi)部存儲(chǔ)下的所有文件目錄。

內(nèi)部存儲(chǔ)

內(nèi)部存儲(chǔ)的文件夾其他應(yīng)用和用戶無(wú)法直接訪問(wèn),可以用于存放敏感數(shù)據(jù)。

  • getCacheDir

    • 專門用于存放緩存數(shù)據(jù)。

    • 用戶對(duì)app進(jìn)行緩存清理的時(shí)候會(huì)清理緩存目錄cache的數(shù)據(jù),手機(jī)空間不足的時(shí)候系統(tǒng)也會(huì)對(duì)緩存目錄內(nèi)的數(shù)據(jù)進(jìn)行清理。但盡管如此,開(kāi)發(fā)者仍要管理好緩存數(shù)據(jù)特別是內(nèi)部存儲(chǔ)的緩存,避免緩存數(shù)據(jù)過(guò)大。

  • getFileDir

    • 可用于用于存放私有持久文件。

    • 非常適合用于存放app各種伴隨app運(yùn)行周期所需要的文件數(shù)據(jù),它既不會(huì)因?yàn)槭謾C(jī)存儲(chǔ)空間不足而被清理,也不會(huì)因卸載app而遺留數(shù)據(jù)垃圾,并且它是私有的。

  • getDir(String name,int mode)

    • 歸類存放私有文件。

    • 在內(nèi)部私有目錄下會(huì)創(chuàng)建一個(gè)名為app_name的文件夾,mode以前是可以設(shè)置文件夾私有(MODE_PRIVATE)和公有的(MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE),但目前公有的mode都已經(jīng)廢棄,意味著這個(gè)api創(chuàng)建的文件夾已經(jīng)完全私有,不能再共享出去了。

外部存儲(chǔ)

在Android Q之前其他應(yīng)用是可以訪問(wèn)修改外部存儲(chǔ)的應(yīng)用私有目錄的,這個(gè)要注意。

使用外部存儲(chǔ)之前一定要檢查外部存儲(chǔ)是否可用,因?yàn)榕f設(shè)備不一定會(huì)有外部存儲(chǔ),新手機(jī)也不一定會(huì)給你讀寫權(quán)限,就算用戶不給你權(quán)限,你的app也要運(yùn)行啊,不然就不用你的了。

public static boolean isSDCardEnable {
return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState);
}
  • getExternalCacheDir

    • 專門用于存放緩存數(shù)據(jù)。和內(nèi)部存儲(chǔ)的getCacheDir相似。

  • getExternalFilesDir(String type)

    • 歸類存放公有文件。

    • 如果type不為的話在外部私有目錄下創(chuàng)建返回一個(gè)名為type的文件夾,為直接返回外部私有根目錄。如無(wú)特別需要,個(gè)人的做法是傳入Environment的DIRECTORY常量進(jìn)行文件夾創(chuàng)建。

    • 如果看完這篇你還不會(huì)選用api,那就把你應(yīng)用雜七雜八的東西都放進(jìn)去吧,文件至少不用東一件西一件的,卸載之后也能夠被正確清理掉,不過(guò)也要控制好占用的存儲(chǔ)空間。

  • getExternalMediaDirs

    • 可存放共享媒體文件。

    • 這個(gè)是在Android 5.0加入的api,創(chuàng)建和獲取位于/sdcard/Android/media目錄下的應(yīng)用目錄,該目錄下的文件能夠被其他應(yīng)用訪問(wèn)和被MediaStore查詢和獲取。但目前較少開(kāi)發(fā)者在使用這個(gè)api。

 

公有目錄

獲取公有目錄要使用Environment的Api,它返回的目錄全都是共享的公有目錄。造成Android手機(jī)文件存儲(chǔ)混亂的罪魁禍?zhǔn)祝閿?shù)眾多的無(wú)責(zé)任開(kāi)發(fā)者在這里胡亂創(chuàng)建文件夾,亂起名、亂放文件,普通用戶根本無(wú)法判斷哪些文件夾、文件是有用的,卸載app之后留下龐大的無(wú)法清理的垃圾文件,導(dǎo)致手機(jī)空間不足。于是它們?cè)贏ndroid Q被廢棄了,但是Q之前還是能好好使用的,我認(rèn)為要開(kāi)始減少使用它們,更多地使用Context下的私有目錄API。

  • getExternalStorageDirectory

    • 獲取外部存儲(chǔ)(SD卡)的根目錄。使用getExternalStoragePublicDirectory(String)進(jìn)行替代即可。

  • getExternalStoragePublicDirectory(String type)

    • 使用頻率極高的api,返回在根目錄下的名為type的文件夾,我把它分為兩種用法:一種是傳入Environment的DIRECTORY常量再創(chuàng)建子目錄使用;一種是傳入appPackageName或者易被識(shí)別歸屬的名稱創(chuàng)建子目錄使用。前者會(huì)比較通用,內(nèi)容可以被各種工具app搜索發(fā)現(xiàn)(包括微信);后者算是私用,可以存放不跟隨app生命的文件,即卸載后也可以保留。

    • Environment.DIRECTORY_DCIM是手機(jī)的相冊(cè),這個(gè)文件夾都是系統(tǒng)相關(guān)的app在用,存放相機(jī)拍攝的圖片,手機(jī)截圖之類的,不推薦開(kāi)發(fā)者使用這個(gè)文件夾,避免混亂。值得一提的是淘寶有在使用這個(gè)文件夾,用于保存它的商品分享截圖,這個(gè)位置的確可以避免被微信封殺~哈哈

    • Environment.DIRECTORY_PICTURES用于存放各種“正式的”圖片,強(qiáng)烈建議在這里創(chuàng)建文件夾存放你想要被用戶發(fā)現(xiàn)的圖片,并且微信會(huì)掃描這個(gè)文件夾,讓你的圖片更容易分享。不過(guò)還。

    • Environment.DIRECTORY_DOWNLOADS可以用于存放app更新的apk等下載資源。

    • 其他幾個(gè)比較少用就不介紹了。

適配Android Q

上面提到Environment的兩個(gè)公有目錄常用API在Android Q被廢棄了,應(yīng)用存儲(chǔ)功能沙箱化,文件存放到沙箱外面要使用 DocumentFile,共享媒體文件要使用MediaStore進(jìn)行,詳細(xì)的適配已有其他開(kāi)發(fā)者分享出來(lái)了,推薦一下這篇:Android Q 存儲(chǔ)機(jī)制大變化(https://link.juejin.im/?target=https%3A%2F%2Ffeng.moe%2Farchives%2F47%2F

我很喜歡的承香墨影也出了篇適配指南,內(nèi)容更加詳細(xì):Android Q 要來(lái)了,給你一份很"全面"的適配指南!(https://mp.weixin.qq.com/s/aiDMyAfAZvaYIHuIMLAlcg

結(jié)尾

最后說(shuō)一下幾個(gè)重要的事:

獲取文件路徑這件事永遠(yuǎn)不能寫死某個(gè)路徑,不存在SD卡怎么辦呢?某個(gè)路徑無(wú)法使用了怎么辦呢?所以管理文件的時(shí)候必須要有存儲(chǔ)策略。比如一個(gè)文件的保存地址獲取方法里不能只有一個(gè)api,要保有兜底措施,如果我不能存在外部?jī)?chǔ)存,那我就存在內(nèi)部,保證app的功能正常運(yùn)行。

這次的這里,希望看完這篇文章之后能夠讓你更了解如何管理手機(jī)文件夾。

分享到:
標(biāo)簽:開(kāi)發(fā) Android
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定