Uygulama Verilerini Programlı Olarak Temizle


121

Uygulamamın verilerini programlı olarak temizlemek istiyorum.

Uygulamanın verileri veritabanları, paylaşılan tercihler, İç-Dış dosyalar veya uygulama içinde oluşturulan diğer dosyalar gibi her şeyi içerebilir.

Mobil cihazdaki verileri şu yollarla temizleyebileceğimizi biliyorum:

Ayarlar-> Uygulamalar-> Uygulamaları Yönet-> Uygulamam-> Verileri Temizle

Ancak yukarıdaki şeyi bir Android Programı aracılığıyla yapmam gerekiyor mu?

Yanıtlar:


111

API 19'da (KitKat) tanıtılan yeni bir API var: ActivityManager.clearApplicationUserData () .

Yeni uygulamalarda kullanmanızı şiddetle tavsiye ederim:

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.
}

Keskin bir yol istemiyorsanız, kullanıcı arayüzündeki düğmeyi de gizleyebilirsiniz, böylece işlevsellik eski telefonlarda kullanılamaz.

Bu yöntemin bilgisi, kullanan herkes için zorunludur android:manageSpaceActivity.


Bunu her kullandığınızda, bir gelen bunu manageSpaceActivitysahip olduğu android:process=":manager". Orada, uygulamamın diğer işlemlerini manuel olarak öldürüyorum . Bu, bir kullanıcı arayüzünün çalışmaya devam etmesine ve kullanıcının bir sonraki nereye gideceğine karar vermesine izin vermeme izin veriyor.

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
benim için .clearApplicationUserData (); uygulamayı da kapatmaya zorlamaktır.
gaurav414u

9
Uygulamayı kapatması gerekir, yoksa tuttuğu verilere sahip olabilir, geri yazılır. Bunu yapmanın tek güvenli yolu (1) uygulamayı sonlandırmak, (2) tüm verilerini temizlemek, (3) uygulama bir dahaki sefer başladığında veri olmadan yeni başlayacaktır.
hackbod

4
Merhaba @TWiStErRob Uygulamamda LOGOUT butonuna tıkladığımda bu metodu uygulamak istiyorum. Ancak uygulamayı zorla kapatır. Bunun yerine, kayıt / oturum açma formunun bulunduğu ana etkinliği başlatmak istiyorum .. Bu nasıl mümkün olacak?
pblead26

1
KitKat öncesi sürümü için şu yanıta bakın: stackoverflow.com/a/23470355/3256989
ultraon

2
Bu kodu uyguladıktan sonra başka bir aktiviteye başlamak mümkün

107

Ben sadece öğreticiyi bu yazıda burada yayınlanan ihrupin bağlantısından koyuyorum .

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;
    }
}

Dolayısıyla, bunu yapmak için bir düğme istiyorsanız, MyApplication.getInstance () 'ı çağırmanız gerekir. clearApplicationData () bir onClickListener içinden

Güncelleme: Sizin SharedPreferencesörnek verilerinizin tutunmak ve bunu silmek sonra tercihleri dosyayı yeniden olabilir. Yani, SharedPreferencesnesnenizi almak isteyeceksiniz ve

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

Güncelleme:

Henüz yapmadıysanız android:name="your.package.MyApplication", application tagiçindeki AndroidManifest.xml dosyasına eklemeniz gerekir . Else, MyApplication.getInstance()döner null, bir çıkan NullPointerException .


5
Kendine iyi bak ! Paylaşım tercihleri ​​de dahil olmak üzere uygulama klasöründeki her şeyi kaldırırsınız .. yalnızca önbelleğin kendisi ve içeriği değil.
Snicolas

2
Bu çözümü uyguladım. Ancak uygulama verilerim temizlenmedi sadece önbellek temizlendi .. Hala 5 MB kaldı .. başka herhangi bir çözüm ?? Lütfen bana yardım et :(
SweetWisher ツ

1
@MinceMan Lütfen bunun daha iyi etki için Uygulamayı genişleten sınıfta yazılması gerektiğini belirtin
creepy_driver

Kitaplığı dir tutmak için çok akıllı.
frostymarvelous

1
evet, tüm dosyaları kaldırdı, ancak uygulama bunu fark etmedi, bu yüzden hala uygulama dizinindeki dosyalar olabilirim. Uygulama, uygulamayı son uygulamadan kaldırdıktan sonra, başlattıktan sonra temizlemeyi fark etti. Aktiviteyi yeniden yaratmaya çalıştım ama işe yaramadı
gturedi

15

2 yanıttaki kodu birleştirin:

İşte ortaya çıkan birleşik kaynak tabanlı cevap

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();
    } 
}

Bu, Android sürümünden bağımsız olarak tüm Android cihazlarda çalışacak mı? Benim için, sahip olduğum 3 Android cihazda çalışıyor (Lollipop, Marshmallow ve Pie ile)
Kathir

evet, eğer else kit kat'a eşit veya daha azsa ... clearApplicationUserData'yı kullanın ve üzerinde runtime.exce kullanır ... temelde bir kabuk komutu kullanır ... izinler dışında oldukça güvenilir ... sadece çalışması gerekir ...
CrandellWS

13

Bunu yapmanın en basit yolu

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();
} }

Bu, verileri temizleyecek ve uygulamanızı bellekten kaldıracaktır. Ayarlar -> Uygulama Yöneticisi -> Uygulamanız -> Verileri temizle altındaki verileri temizle seçeneğine eşdeğerdir


3
Bu yaklaşımı tavsiye etmem. pmVar olmayabilecek komut satırı programlarını (örneğin ) kullanmak risklidir. Android SDK "sözleşmesinin" bir parçası değildirler ve bu nedenle, belirli bir cihazda var olup olmadıkları veya diğer cihazlarda yaptıkları gibi davranıp davranmadıkları, üreticilere ve özel ROM geliştiricilerine bağlıdır.
CommonsWare

2
Alternatif olarak bir seçeneğim daha var, yani ((ActivityManager) context.getSystemService (ACTIVITY_SERVICE)) .clearApplicationUserData (); Ancak, yalnızca API düzeyinde çalışmasının bir sınırlaması vardır> = 19 Lütfen burada bir alternatif sağlayabilir misiniz veya başka bir seçenek olabilir.
Summved Jain

2

Her yerde kullandığım şey:

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

Yukarıdaki kod parçasının yürütülmesi, uygulamayı kapatır ve tüm veritabanlarını ve paylaşılan tercihleri ​​kaldırır


-1

Daha az ayrıntılı bir hack istiyorsanız:

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

1
Boşluklar ve benzeri şeyler olması durumunda bu yoldan alıntı yapmak isteyebilirsiniz.
TWiStErRob
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.