2016-11-14更新

其实,谷歌提供了方法可以让我们很便捷的在卸载应用的时候同时删除该应用的文件夹。

就是在创建文件夹的时候,不要自己去指定文件夹,而是采用系统指定给你的文件路径去进行存储。

Context.getExternalFilesDir(String Type)      外部存储目录
Context.getExternalCacheDir(String Type)      外部存储缓存目录
Context.getFilesDir                           内部存储目录
Context.getCacheDir                           内部存储缓存目录

通过这几个方法,可以获取,应用创建时,系统自动创建的文件目录,在卸载时,系统会自动删除文件夹。

推荐使用Context.getExternalFilesDir和 getExternalCacheDir

因为获取内部存储目录获取到的地址在android文件夹内是不可见的,会出现一系列的问题



//以下内容是使用监听,但不能针对所有手机,所以建议使用上面的方法

Android与IOS一个比较大的不同就是文件夹部分,IOS在卸载应用的时候会同时删除应用所创建的所有文件及文件夹,Android不会。

以下是执行这个操作的方法。

首先写一个广播接收器即BroadcastReceiver

public class Receiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		if (intent.getAction().equals("android.intent.action.PACKAGE_REMOVED")) {
			String packageName = intent.getDataString();
			Log.e("Test", "---------------" + "PACKAGE_REMOVED" + packageName);
			File file1 = new File(CommonData.INI_DATABASE_PATH + "InfoData.sqlite");
			if (file1.isFile()&&file1.exists()) {
				file1.delete();
			}
			File file2 = new File(CommonData.INI_DATABASE_PATH + "InfoData.sqlite-journal");
			if (file2.isFile()&&file2.exists()) {
				file2.delete();
			}
		}
	}

}



然后在Manifest中进行注册

<receiver android:name="com.digitalcq.maincity.util.Receiver" >
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_ADDED" />
                <action android:name="android.intent.action.PACKAGE_REMOVED" />

                <data android:scheme="package" />
            </intent-filter>
        </receiver>



这里我同时监听了应用添加及应用卸载,可以按需要书写

PS:监听的是package的删除及添加,因为应用删除卸载时,package会删除添加

同时这里也可以在代码中注册,可以自行操作。


监听设置完毕,进行文件删除

1.)删除单个文件

删除文件相对来说比较简单就是我写在BroadcastReceiver 中的代码

2.)删除整个文件夹

这个操作因为我没有用,所以没有自行研究,以下是网上的代码


/**
     * 删除文件夹以及目录下的文件
     * @param   filePath 被删除目录的文件路径
     * @return  目录删除成功返回true,否则返回false
     */
    public boolean deleteDirectory(String filePath) {
    boolean flag = false;
        //如果filePath不以文件分隔符结尾,自动添加文件分隔符
        if (!filePath.endsWith(File.separator)) {
            filePath = filePath + File.separator;
        }
        File dirFile = new File(filePath);
        if (!dirFile.exists() || !dirFile.isDirectory()) {
            return false;
        }
        flag = true;
        File[] files = dirFile.listFiles();
        //遍历删除文件夹下的所有文件(包括子目录)
        for (int i = 0; i < files.length; i++) {
            if (files[i].isFile()) {
            //删除子文件
                flag = deleteFile(files[i].getAbsolutePath());
                if (!flag) break;
            } else {
            //删除子目录
                flag = deleteDirectory(files[i].getAbsolutePath());
                if (!flag) break;
            }
        }
        if (!flag) return false;
        //删除当前空目录
        return dirFile.delete();
    }

    /**
     *  根据路径删除指定的目录或文件,无论存在与否
     *@param filePath  要删除的目录或文件
     *@return 删除成功返回 true,否则返回 false。
     */
    public boolean DeleteFolder(String filePath) {
    File file = new File(filePath);
        if (!file.exists()) {
            return false;
        } else {
            if (file.isFile()) {
            // 为文件时调用删除文件方法
                return deleteFile(filePath);
            } else {
            // 为目录时调用删除目录方法
                return deleteDirectory(filePath);
            }
        }
    }



到此就可以了