回答:
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);
}
}
}
私はこの投稿でここに投稿されたリンク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が発生します。
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();
}
}
これを行う最も簡単な方法は
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();
} }
これにより、データが消去され、アプリがメモリから削除されます。これは、[設定]-> [アプリケーションマネージャー]-> [アプリ]-> [データを消去]の[データを消去]オプションと同等です。
pm存在しない可能性のあるコマンドラインプログラム(など)を使用するのは危険です。これらはAndroid SDKの「契約」の一部ではないため、特定のデバイスに存在するか、他のデバイスと同じように動作するかは、製造元とカスタムROM開発者次第です。
私がどこでも使用しているもの:
Runtime.getRuntime().exec("pm clear me.myapp");
上記のコードを実行すると、アプリケーションが閉じ、すべてのデータベースと共有設定が削除されます
冗長なハックが必要な場合:
void deleteDirectory(String path) {
Runtime.getRuntime().exec(String.format("rm -rf %s", path));
}