プログラムでアプリケーションのデータをクリアする


120

プログラムでアプリケーションのデータを消去したい。

アプリケーションのデータには、データベース、共有設定、内部外部ファイル、またはアプリケーション内で作成されたその他のファイルなどが含まれます。

次の方法でモバイルデバイスのデータを消去できることを知っています。

設定->アプリケーション->アプリケーションの管理-> My_application->データのクリア

しかし、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)次にアプリを起動したときにデータなしで新しく開始することです。
ハックボード2015年

4
こんにちは@TWiStErRob私のアプリケーションで[ログアウト]ボタンをクリックしたときにこのメソッドを実装したいと思います。しかし、それはアプリを強制的に閉じます。代わりに、サインアップ/サインインフォームが存在するメインアクティビティを開始します。これはどのようにして可能ですか?
pblead26

1
:前のキットカット版ではこの答えを参照stackoverflow.com/a/23470355/3256989
ultraon

2
このコードを適用した後、他のアクティビティを開始することは可能ですか
Amandeep Rohila 2017

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
@MinceManこれは、アプリケーションを拡張するクラスで作成する必要があることを明記してください
creepy_driver

lib dirを保持することは非常に賢明です。
凍りつくような素晴らしい

1
はい、それはすべてのファイルを削除しましたが、アプリはそれを認識しなかったので、私はまだアプリディレクトリのファイルである可能性があります。最近のアプリからアプリを削除してからクリアすると、アプリはそれを開始します。アクティビティを再現しようとしましたが、うまく
いき

15

2つの回答のコードを組み合わせる:

これは、結果として得られた組み合わせのソースベースの回答です

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がキットkatと等しいか、それよりも小さい場合... 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 2017

2
別の方法として、もう1つのオプションがあります。つまり((ActivityManager)context.getSystemService(ACTIVITY_SERVICE)).clearApplicationUserData(); ただし、APIレベルが19以上の場合にのみ機能するという制限があります。ここで代替を提供できますか、それとも別のオプションである可能性があります。
Suminved Jain 2017

2

私がどこでも使用しているもの:

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

上記のコードを実行すると、アプリケーションが閉じ、すべてのデータベースと共有設定が削除されます


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.