22

我創建了一個應用程序,它創建和存儲文件到SD卡。有沒有辦法將文件夾與應用程序綁定,以便在用戶在Android設備上運行卸載時刪除所有文件?Android - 保存或刪除應用程序在卸載時創建的文件

+0

應用`NQ移動Security`是在http://i.imgur.com/停靠卸載外觀的活動Fos9N.png,http://i.imgur.com/fIZbK.png,http://i.imgur.com/cG9Hr.png和問題http://stackoverflow.com/questions/10219328/how-to-顯示活動之前我的應用程序是卸載安卓 – 2012-06-16 10:23:16

回答

10

您的應用程序無法知道它正在被卸載(無需修改內核)。在data/data/your.app.package中創建的所有文件在安裝後會自動刪除。

我不認爲從SD卡上清除任何東西。你可以做一個快速測試並找出答案。

另一種方法可能是讓另一個應用程序檢查該應用程序是否安裝。如果不是,它可以做清理工作。

+0

應用程序`NQ移動安全`調用一個活動在卸載看http://i.imgur.com/Fos9N.png,http: //i.imgur.com/fIZbK.png,http://i.imgur.com/cG9Hr.png和問題http://stackoverflow.com/questions/10219328/how-to-show-an-activity-before-my-app-is-uninstalled-android – 2012-06-16 10:22:13

+0

對於爲Android 6.0或更高版本編譯的應用程序並啓用雲備份,請參閱Y.S.的答案。 – dermatthias 2017-02-09 14:40:25

23

似乎自2009年以來有一些發展:)。

documentation

如果您使用API​​ 8級或更大 ,使用getExternalCacheDir()來 打開表示 外部存儲目錄,你應該 保存緩存文件的文件。如果用戶 卸載您的應用程序,這些 文件將被自動刪除。然而,在您的 應用程序的生命週期中,您應該管理這些 緩存文件,並刪除那些不需要的文件以便保留 文件空間。

如果您使用API​​ 7級或更低, 使用getExternalStorageDirectory()到 打開表示外部存儲的根 一個文件,然後在下面的 目錄寫 緩存數據:

/Android/data // cache/ 這是您的Java風格的 程序包名稱,例如 「com.example.android.app」。

0
如果要存儲大量數據,然後將其與文件路徑名保存在外部存儲

Environment.getExternalStorageDirectory().toString()+"/Android/data/packageName" 

這裏包的名字是你的應用程序包名稱,如com.think.abc

4

即使在使用getExternalCacheDir()時,我也已經看到,應用程序包名稱的緩存目錄不會像在Android文檔中所說的那樣自動刪除,至少在聯想A1上不會。這可能有點天真,但您可能需要在重新安裝期間清理以前的數據。在那裏,您可以瞭解您的應用程序是否是第一次安裝或正在安裝的 - 您可以使用共享首選項存儲值(可能是布爾值)。它可以是這樣的:

SharedPreferences sharedPrefs = getSharedPreferences(INSTALL_PREFS, MODE_PRIVATE); 
if(sharedPrefs.getBoolean("AppInstalled", false) == false){ 
    //DELETE APP DIRECTORY 
    SharedPreferences.Editor editor = sharedPrefs.edit(); 
    editor.putBoolean("AppInstalled", true); 
    editor.commit(); 
} 

這樣,每次應用程序運行時,它都會檢查它是否是第一次運行。當應用程序被刪除時,應用程序的共享首選項也會被刪除。然後,下次安裝時,if(...)將是true,您可以在那裏進行一些清理。

我知道這並不直接回答這個問題,並且在用戶的設備上留下未使用的數據並不好,但我認爲這可能是嘗試清理應用程序被刪除時的一種替代方法,這是明智的但似乎不可能。

+0

我不知道我是否被誤解,但似乎它會按預期工作,如果您從第一次應用發佈以來使用它,您是否同意? – 2014-11-13 14:42:07

3

似乎從那以後有一個正確的soltuion,Context.getExternalFilesDir()

返回到外部文件系統 目錄的絕對路徑(即在Environment.getExternalStorageDirectory某處()),其中 的應用程序可以放置它擁有的持久性文件。這些文件是應用程序專用的 ,並且對於用戶而言通常不可見爲 媒體。

這就好比getFilesDir()中,當 卸載應用程序

3

我加入這個,因爲現有的答案是在2017年 過時雖然這是事實,這些文件將被刪除,有在應用程序卸載時沒有回調,已經提供了一些機制來保存除卸載之外的應用程序數據。

  • 由於Android 6.0(API 23),所述Auto Backup for Apps 特徵被引入,這允許開發人員能夠允許或阻止自動應用備份。從API 23開始,默認情況下啓用備份。

  • 兩個新的application標籤已引入清單文件:android:allowBackupandroid:fullBackupContent

停用自動備份,在application標籤下添加android:allowBackup="false"清單文件。值爲「true」會自動將共享首選項和數據庫保存到雲,以及other files

其次,你可以很具體的你要的文件,以包括排除刪除或保存在與android:fullBackupContent標籤卸載。該屬性指向包含備份規則的XML文件。以下語法創建的res/xml/目錄中的XML配置文件:

<full-backup-content> 
    <include domain=["file" | "database" | "sharedpref" | "external" | "root"] 
    path="string" /> 
    <exclude domain=["file" | "database" | "sharedpref" | "external" | "root"] 
    path="string" /> 
</full-backup-content> 

在這裏,您可以添加特定的文件類型包含或排除及其相關路徑。將android:fullBackupContent = "@xml/my_backup_rules"標記添加到application標記下的清單文件中。

指定文件將備份到設備主電子郵件帳戶下的Google Drive。在重新安裝時,數據將被恢復,只要用戶啓用以下設置

Settings -> Backup & Reset -> Automatic Restore

還應該注意的是備份數據不能被用戶或設備上的其他應用程序讀取。

enter image description here

同樣也可以從谷歌雲端硬盤應用,從這裏訪問:

Google Drive -> Settings -> Auto backup for apps -> Backup and reset

enter image description here

值得注意的是,如果同一個主要谷歌帳戶用於多個設備,然後創建多個設備備份。單個設備的備份,可以從這裏訪問:

Google Drive -> Settings -> Backups

Google Drive -> Settings -> Backups

相關問題