프로그래밍 방식으로 애플리케이션의 데이터 지우기


120

내 애플리케이션의 데이터를 프로그래밍 방식으로 지우고 싶습니다.

애플리케이션의 데이터에는 데이터베이스, 공유 환경 설정, 내부-외부 파일 또는 애플리케이션 내에서 생성 된 기타 파일과 같은 것이 포함될 수 있습니다.

다음을 통해 모바일 장치의 데이터를 지울 수 있다는 것을 알고 있습니다.

설정-> 응용 프로그램-> 응용 프로그램 관리-> 내 _ 응용 프로그램-> 데이터 지우기

하지만 Android 프로그램을 통해 위의 작업을 수행해야합니까?

답변:


110

API 19 (KitKat)에 도입 된 새로운 API : ActivityManager.clearApplicationUserData ()가 있습니다.

새로운 응용 프로그램에서 사용하는 것이 좋습니다.

import android.os.Build.*;
if (VERSION_CODES.KITKAT <= VERSION.SDK_INT) {
    ((ActivityManager)context.getSystemService(ACTIVITY_SERVICE))
            .clearApplicationUserData(); // note: it has a return value!
} else {
    // use old hacky way, which can be removed
    // once minSdkVersion goes above 19 in a few years.
}

해키 방식을 원하지 않는 경우 UI에서 버튼을 숨길 수도 있으므로 이전 휴대폰에서는 해당 기능을 사용할 수 없습니다.

이 방법에 대한 지식은 android:manageSpaceActivity.


나는이를 사용할 때마다, 나는에서 그렇게 manageSpaceActivity이있는 android:process=":manager". 거기에서 내 앱의 다른 프로세스를 수동으로 종료 합니다. 이를 통해 UI를 계속 실행하고 사용자가 다음에 이동할 위치를 결정할 수 있습니다.

private static void killProcessesAround(Activity activity) throws NameNotFoundException {
    ActivityManager am = (ActivityManager)activity.getSystemService(Context.ACTIVITY_SERVICE);
    String myProcessPrefix = activity.getApplicationInfo().processName;
    String myProcessName = activity.getPackageManager().getActivityInfo(activity.getComponentName(), 0).processName;
    for (ActivityManager.RunningAppProcessInfo proc : am.getRunningAppProcesses()) {
        if (proc.processName.startsWith(myProcessPrefix) && !proc.processName.equals(myProcessName)) {
            android.os.Process.killProcess(proc.pid);
        }
    }
}

9
나를 위해 .clearApplicationUserData (); 앱을 강제 종료하는 것입니다.
gaurav414u 2015

9
앱을 종료해야합니다. 그렇지 않으면 보유하고있는 데이터가 다시 기록 될 수 있습니다. 이렇게하는 유일한 안전한 방법은 (1) 앱을 종료하고, (2) 모든 데이터를 지우고, (3) 다음에 앱을 시작할 때 데이터없이 새로 시작하는 것입니다.
hackbod

4
안녕하세요 @TWiStErRob 내 응용 프로그램에서 LOGOUT 버튼을 클릭했을 때이 방법을 구현하고 싶습니다. 그러나 강제로 앱을 닫습니다. 대신 가입 / 로그인 양식이있는 주요 활동을 시작하고 싶습니다. 어떻게 이것이 가능합니까?
pblead26 jul.

1
KitKat 이전 버전의 경우 다음 답변을 참조하십시오. stackoverflow.com/a/23470355/3256989
ultraon

2
이 코드를 적용한 후 다른 활동을 시작할 수
있습니까

106

이 게시물 여기에 게시 된 링크 ihrupin 에서 튜토리얼을 넣을뿐입니다 .

package com.hrupin.cleaner;

import java.io.File;

import android.app.Application;
import android.util.Log;

public class MyApplication extends Application {

    private static MyApplication instance;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public static MyApplication getInstance() {
        return instance;
    }

    public void clearApplicationData() {
        File cacheDirectory = getCacheDir();
        File applicationDirectory = new File(cacheDirectory.getParent());
        if (applicationDirectory.exists()) {
            String[] fileNames = applicationDirectory.list();
            for (String fileName : fileNames) {
                if (!fileName.equals("lib")) {
                    deleteFile(new File(applicationDirectory, fileName));
                }
            }
        }
    }

    public static boolean deleteFile(File file) {
        boolean deletedAll = true;
        if (file != null) {
            if (file.isDirectory()) {
                String[] children = file.list();
                for (int i = 0; i < children.length; i++) {
                    deletedAll = deleteFile(new File(file, children[i])) && deletedAll;
                }
            } else {
                deletedAll = file.delete();
            }
        }

        return deletedAll;
    }
}

따라서 버튼이이를 수행하려면 MyApplication.getInstance ()를 호출해야합니다. onClickListener 내에서 clearApplicationData ()

업데이트 : 귀하의 SharedPreferences인스턴스가 데이터 붙잡고 당신이 그것을 삭제 한 후 환경 설정 파일을 다시 수 있습니다. 그래서 당신은 당신의 SharedPreferences물건 을 얻고 싶어 하고

prefs.edit().clear().commit();

최신 정보:

당신은 추가해야 android:name="your.package.MyApplication"받는 사람 application tag이 그렇게하지 않았다면 내부의 AndroidManifest.xml. 그렇지 않으면을 MyApplication.getInstance()반환 null하여 NullPointerException을 발생 시킵니다.


5
조심해! 공유 기본 설정을 포함하여 앱 폴더의 모든 항목을 제거합니다. 캐시 디렉토리 자체와 그 내용뿐만 아니라.
Snicolas 2013 년

2
이 솔루션을 구현했습니다. 하지만 내 응용 프로그램 데이터가 지워지지 않고 캐시 만 지워집니다. 5MB가 아직 남아 있습니다 .. 다른 솔루션이 있습니까 ?? 제발 도와주세요 :(
SweetWisher ツ

1
더 나은 효과에 대한 응용 프로그램 확장이이 클래스에서 writted해야한다는하시기 바랍니다 @MinceMan 언급
creepy_driver

lib 디렉토리를 유지하는 것이 매우 현명합니다.
frostymarvelous 2011

1
예, 모든 파일을 제거했지만 앱이 인식하지 못 했으므로 여전히 앱 디렉토리에 파일이 될 수 있습니다. 최근 앱에서 앱을 제거한 후 앱을 시작하면 앱이 삭제됩니다. 나는 재 작성 작업을 시도했지만하지 작업
gturedi

15

두 가지 답변의 코드를 결합하십시오.

다음은 결합 된 소스 기반 답변입니다.

private void clearAppData() {
    try {
        // clearing app data
        if (Build.VERSION_CODES.KITKAT <= Build.VERSION.SDK_INT) {
            ((ActivityManager)getSystemService(ACTIVITY_SERVICE)).clearApplicationUserData(); // note: it has a return value!
        } else {
            String packageName = getApplicationContext().getPackageName();
            Runtime runtime = Runtime.getRuntime();
            runtime.exec("pm clear "+packageName);
        }

    } catch (Exception e) {
        e.printStackTrace();
    } 
}

Android 버전에 관계없이 모든 Android 기기에서 작동하나요? 저에게는 내가 소유 한 3 개의 Android 기기 (Lollipop, Marshmallow 및 Pie 포함) 모두에서 작동합니다.
Kathir

그렇습니다 if else는 킷캣보다 같거나 작은 것입니다 ... clearApplicationUserData를 사용하고 그 이상에서는 runtime.exce를 사용합니다 ... 기본적으로 쉘 명령 ... 권한 이외의 매우 안정적입니다 ... 그냥 작동해야합니다 ...
CrandellWS

12

이를 수행하는 가장 간단한 방법은

private void deleteAppData() {
     try {
    // clearing app data
    String packageName = getApplicationContext().getPackageName();
    Runtime runtime = Runtime.getRuntime();
    runtime.exec("pm clear "+packageName);

} catch (Exception e) {
    e.printStackTrace();
} }

이렇게하면 데이터가 지워지고 메모리에서 앱이 제거됩니다. 설정-> 응용 프로그램 관리자-> 앱-> 데이터 지우기의 데이터 지우기 옵션과 동일합니다.


3
이 접근 방식을 권장하지 않습니다. pm존재하지 않을 수있는 명령 줄 프로그램 (예 :)을 사용하는 것은 위험합니다. Android SDK "계약"의 일부가 아니므로 특정 기기에 존재하는지 또는 다른 기기에서와 동일하게 작동하는지 여부는 제조업체 및 맞춤 ROM 개발자에게 달려 있습니다.
CommonsWare

2
대안으로 하나 더 옵션이 있습니다. 즉 ((ActivityManager) context.getSystemService (ACTIVITY_SERVICE)) .clearApplicationUserData (); 그러나 API 레벨> = 19에서만 작동한다는 제한이 있습니다. 여기에 대안을 제공하거나 다른 옵션이 될 수 있습니다.
Summved Jain

2

내가 어디서나 사용하는 것 :

 Runtime.getRuntime().exec("pm clear me.myapp");

위의 코드를 실행하면 응용 프로그램이 닫히고 모든 데이터베이스와 공유 환경 설정이 제거됩니다.


-1

덜 장황한 해킹을 원한다면 :

void deleteDirectory(String path) {
  Runtime.getRuntime().exec(String.format("rm -rf %s", path));
}

1
공백 등이있는 경우 해당 경로를 인용 할 수 있습니다.
TWiStErRob
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.