程序員:怎樣釋放你的Android手機(jī)存儲(chǔ)空間

Android應(yīng)用在運(yùn)行之中會(huì)產(chǎn)生一些數(shù)據(jù)坐漏,比如圖片的緩存歇僧,數(shù)據(jù)庫(kù)文件,配置文件等等垫挨。我們開發(fā)時(shí)可能會(huì)有這樣的一個(gè)需求清除應(yīng)用內(nèi)緩存的數(shù)據(jù)韩肝,可以讓用戶選擇刪除應(yīng)用內(nèi)產(chǎn)生的數(shù)據(jù),這也是比較人性化的設(shè)計(jì)點(diǎn)九榔。過(guò)多的緩存會(huì)占用手機(jī)的存儲(chǔ)空間哀峻,據(jù)說(shuō)也會(huì)降低手機(jī)的IO性能。 下面這是簡(jiǎn)書Android APP中提供了清除緩存的設(shè)計(jì):

簡(jiǎn)書清除緩存

那么Android應(yīng)用在運(yùn)行中會(huì)產(chǎn)生哪些數(shù)據(jù)呢哲泊?它們都被存放在哪里剩蟀?然后我們根據(jù)產(chǎn)生數(shù)據(jù)的位置實(shí)現(xiàn)清除功能

首先簡(jiǎn)單講講Android的四種數(shù)據(jù)存儲(chǔ)方式

1、SharePreference:

一種輕型的數(shù)據(jù)存儲(chǔ)方式切威,實(shí)際上是基于XML文件存儲(chǔ)的“key-value”鍵值對(duì)數(shù)據(jù)育特;通常用來(lái)存儲(chǔ)程序的一些配置信息。

SharePreference的存儲(chǔ)目錄:

其存儲(chǔ)在“data/data/程序包名/shared_prefs目錄下先朦。

SharePreference修改和存儲(chǔ)數(shù)據(jù)

  • 根據(jù)Context的getSharedPrerences(key, [模式])方法獲取SharedPreference對(duì)象缰冤;
  • 利用SharedPreference的editor()方法獲取Editor對(duì)象;
  • 通過(guò)Editor的putXXX()方法喳魏,將鍵值對(duì)存儲(chǔ)數(shù)據(jù)棉浸;
  • 通過(guò)Editor的commit()方法將數(shù)據(jù)提交到SharedPreference內(nèi)

2、SQLite

SQLite是一個(gè)輕量級(jí)關(guān)系型數(shù)據(jù)庫(kù)刺彩,既然是關(guān)系型數(shù)據(jù)庫(kù)迷郑,那操作起來(lái)其實(shí)跟mysql枝恋、sql server差不多的。

Android提供了強(qiáng)大數(shù)據(jù)庫(kù)管理庫(kù)嗡害,同時(shí)也支持運(yùn)行哦原生命令鼓择,實(shí)現(xiàn)數(shù)據(jù)庫(kù)的增刪改查

3、 File

Android中可以在設(shè)備本身的存儲(chǔ)設(shè)備或外接的存儲(chǔ)設(shè)備中創(chuàng)建用于保存數(shù)據(jù)的文件就漾。在默認(rèn)狀態(tài)下呐能,文件是不能在不同程序間共享的。

File可以通過(guò)FileInputStream和FileOutputStream對(duì)文件進(jìn)行操作抑堡。

4摆出、ContentProvider

ContentProvider相對(duì)于其它的方式比較復(fù)雜,當(dāng)然其功能相對(duì)于其它的方式也是革命性的改變首妖。它能夠?qū)崿F(xiàn)跨應(yīng)用之間的數(shù)據(jù)操作偎漫。利用ContentResolver對(duì)象的delete、update有缆、insert象踊、query等方法去操ContentProvider的對(duì)象,讓ContentProvider對(duì)象的方法去對(duì)數(shù)據(jù)操作杯矩。

實(shí)現(xiàn)方式為:

  • 在A程序中定義一個(gè)ContentProvider,重載其增刪查改等方法袖外;
  • 在A程序中的AndroidManifest.xml中注冊(cè)ContentProvider史隆;
  • 在B程序中通過(guò)ContentResolver和Uri來(lái)獲取ContentProvider的數(shù)據(jù),同樣利用Resolver的增刪查改方法來(lái)獲得和處理數(shù)據(jù)

Android應(yīng)用的數(shù)據(jù)存儲(chǔ)路徑

應(yīng)用內(nèi)數(shù)據(jù)的所有路徑和對(duì)應(yīng)的數(shù)據(jù)清除代碼:

  • /data/data/com.xxx.xxx/cache - 應(yīng)用內(nèi)緩存(注:對(duì)應(yīng)方法**getCacheDir() **)
   public static void cleanInternalCache(Context context) {
       deleteFilesByDirectory(context.getCacheDir());
   }
  • /data/data/com.xxx.xxx/databases - 應(yīng)用內(nèi)數(shù)據(jù)庫(kù)
    public static void cleanDatabases(Context context) {
        deleteFilesByDirectory(new File("/data/data/"
                + context.getPackageName() + "/databases"));
    }
  • /data/data/com.xxx.xxx/shared_prefs - 應(yīng)用內(nèi)配置文件
 public static void cleanSharedPreference(Context context) {
        deleteFilesByDirectory(new File("/data/data/"
                + context.getPackageName() + "/shared_prefs"));
    }
  • /data/data/com.xxx.xxx/files - 應(yīng)用內(nèi)文件(注:對(duì)應(yīng)方法getFilesDir())
  public static void cleanFiles(Context context) {
        deleteFilesByDirectory(context.getFilesDir());
    }

由于Android應(yīng)用數(shù)據(jù)存儲(chǔ)的權(quán)限比較寬泛曼验,一個(gè)Android應(yīng)用幾乎可以在SD卡任意位置創(chuàng)建一個(gè)目錄和文件泌射,所以上面的幾個(gè)存儲(chǔ)路徑只是Android應(yīng)用最基本的存儲(chǔ)路徑。更多的清除代碼實(shí)現(xiàn)在下面的清除工具類中將于更詳細(xì)的講解

清除工具類的代碼實(shí)現(xiàn)

為了方便使用鬓照,下面時(shí)我封裝好的數(shù)據(jù)清除工具類:

package cn.wangbaiyuan.utils;

/**
 * Created by BrainWang on 2017-02-21.
 */
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import android.content.Context;
import android.os.Environment;

/**
 * 清除緩存
 *
 */
public class CleanDataUtil {


    /** * 清除本應(yīng)用內(nèi)部緩存(/data/data/com.xxx.xxx/cache) * * @param context */
    public static void cleanInternalCache(Context context) {
        deleteFilesByDirectory(context.getCacheDir());
    }

    /** * 清除本應(yīng)用所有數(shù)據(jù)庫(kù)(/data/data/com.xxx.xxx/databases) * * @param context */
    public static void cleanDatabases(Context context) {
        deleteFilesByDirectory(new File("/data/data/"
                + context.getPackageName() + "/databases"));
    }

    /**
     * * 清除本應(yīng)用SharedPreference(/data/data/com.xxx.xxx/shared_prefs) * * @param
     * context
     */
    public static void cleanSharedPreference(Context context) {
        deleteFilesByDirectory(new File("/data/data/"
                + context.getPackageName() + "/shared_prefs"));
    }

    /** * 按名字清除本應(yīng)用數(shù)據(jù)庫(kù) * * @param context * @param dbName */
    public static void cleanDatabaseByName(Context context, String dbName) {
        context.deleteDatabase(dbName);
    }

    /** * 清除/data/data/com.xxx.xxx/files下的內(nèi)容 * * @param context */
    public static void cleanFiles(Context context) {
        deleteFilesByDirectory(context.getFilesDir());
    }

    /**
     * * 清除外部cache下的內(nèi)容(/mnt/sdcard/android/data/com.xxx.xxx/cache) * * @param
     * context
     */
    public static void cleanExternalCache(Context context) {
        if (Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            deleteFilesByDirectory(context.getExternalCacheDir());
        }
    }

    /** * 清除自定義路徑下的文件熔酷,使用需小心,請(qǐng)不要誤刪豺裆。而且只支持目錄下的文件刪除 * * @param filePath */
    public static void cleanCustomCache(String filePath) {
        deleteFilesByDirectory(new File(filePath));
    }

    /** * 清除本應(yīng)用所有的數(shù)據(jù) * * @param context * @param filepath */
    public static void cleanApplicationData(Context context, String... filepath) {
        cleanInternalCache(context);
        cleanExternalCache(context);
        cleanDatabases(context);
        cleanSharedPreference(context);
        cleanFiles(context);
        for (String filePath : filepath) {
            cleanCustomCache(filePath);
        }
    }

    /** * 刪除方法 這里只會(huì)刪除某個(gè)文件夾下的文件拒秘,如果傳入的directory是個(gè)文件,將不做處理 * * @param directory */
    private static void deleteFilesByDirectory(File directory) {
        if (directory != null && directory.exists() && directory.isDirectory()) {
            for (File item : directory.listFiles()) {
                item.delete();
            }
        }
    }

    /**
     * 清除所有緩存留储,相當(dāng)于設(shè)置里應(yīng)用管理中的“清除數(shù)據(jù)”翼抠,清除數(shù)據(jù)時(shí)應(yīng)用將會(huì)退出
     * @param context
     */
    public static void clearAppUserData(Context context) {
        try {
            Runtime.getRuntime().exec("pm clear " + context.getPackageName());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

系統(tǒng)設(shè)置應(yīng)用管理的”清除數(shù)據(jù)“的實(shí)現(xiàn)方法

在Android系統(tǒng)設(shè)置的應(yīng)用管理中,提供了”清除數(shù)據(jù)“的功能获讳,這一功能對(duì)應(yīng)用數(shù)據(jù)的清除更加徹底,我們可以在代碼中實(shí)現(xiàn)類似的需求活喊,不過(guò)下面代碼的執(zhí)行將使應(yīng)用退出:

  /**
     * 清除所有緩存丐膝,相當(dāng)于設(shè)置里應(yīng)用管理中的“清除數(shù)據(jù)”,清除數(shù)據(jù)時(shí)應(yīng)用將會(huì)退出
     * @param context
     */
    public static void clearAppUserData(Context context) {
        try {
            Runtime.getRuntime().exec("pm clear " + context.getPackageName());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

碼字辛苦,歡迎客官打賞

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末帅矗,一起剝皮案震驚了整個(gè)濱河市偎肃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌浑此,老刑警劉巖累颂,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異凛俱,居然都是意外死亡紊馏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蒲犬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)朱监,“玉大人,你說(shuō)我怎么就攤上這事原叮『毡啵” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵奋隶,是天一觀的道長(zhǎng)擂送。 經(jīng)常有香客問(wèn)我,道長(zhǎng)唯欣,這世上最難降的妖魔是什么团甲? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮黍聂,結(jié)果婚禮上躺苦,老公的妹妹穿的比我還像新娘。我一直安慰自己产还,他們只是感情好匹厘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著脐区,像睡著了一般愈诚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上牛隅,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天炕柔,我揣著相機(jī)與錄音,去河邊找鬼媒佣。 笑死匕累,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的默伍。 我是一名探鬼主播欢嘿,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼衰琐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了炼蹦?” 一聲冷哼從身側(cè)響起羡宙,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掐隐,沒(méi)想到半個(gè)月后狗热,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡虑省,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年匿刮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慷妙。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡僻焚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出膝擂,到底是詐尸還是另有隱情虑啤,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布架馋,位于F島的核電站狞山,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏叉寂。R本人自食惡果不足惜萍启,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屏鳍。 院中可真熱鬧勘纯,春花似錦、人聲如沸钓瞭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)山涡。三九已至堤结,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸭丛,已是汗流浹背竞穷。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鳞溉,地道東北人瘾带。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像穿挨,于是被迫代替她去往敵國(guó)和親月弛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肴盏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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