प्रोग्राम के अनुप्रयोग का डेटा साफ़ करें


121

मैं अपने एप्लिकेशन के डेटा को प्रोग्रामेटिक रूप से क्लियर करना चाहता हूं।

एप्लिकेशन के डेटा में डेटाबेस, साझा प्राथमिकताएं, आंतरिक-बाहरी फ़ाइलें या एप्लिकेशन के भीतर बनाई गई किसी भी अन्य फ़ाइल जैसी कुछ भी हो सकती हैं।

मुझे पता है कि हम मोबाइल डिवाइस में डेटा को क्लियर कर सकते हैं:

सेटिंग्स-> एप्लीकेशन-> मैनेजएप्लिकेशंस-> My_application-> स्पष्ट डेटा

लेकिन मुझे एंड्रॉइड प्रोग्राम के माध्यम से उपरोक्त कार्य करने की आवश्यकता है?

जवाबों:


111

एपीआई 19 (किटकैट) में शुरू किया गया एक नया एपीआई है: एक्टिविटमैनेजर.क्लेयर एप्लायस यूसरडाटा ()

मैं नए अनुप्रयोगों में इसका उपयोग करने की अत्यधिक सलाह देता हूं:

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"। वहां, मैं अपने ऐप की अन्य प्रक्रियाओं को मैन्युअल रूप से मारता हूं। यह मुझे यूआई को चलने देने की अनुमति देता है और उपयोगकर्ता को यह तय करने देता है कि आगे कहां जाना है।

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 (); के रूप में अच्छी तरह से एप्लिकेशन को बंद करने के लिए मजबूर है।
गौरव ४१४ यूआर

9
यह एप्लिकेशन को मारने के लिए है, या यह डेटा है कि यह उस पर पकड़ रहा है वापस लिखा मिलेगा। ऐसा करने का एकमात्र सुरक्षित तरीका (1) ऐप को मारना है, (2) इसके सभी डेटा को साफ़ करें, (3) अगली बार ऐप शुरू होने पर यह बिना किसी डेटा के नए सिरे से शुरू होगा।
२०:३५ पर हैकबोड

4
हाय @TWiStErRob जब मैं अपने आवेदन में लॉग इन बटन पर क्लिक करता हूं तो मैं इस विधि को लागू करना चाहता हूं। लेकिन यह एप्लिकेशन को बंद कर देता है। इसके बजाय मैं मुख्य गतिविधि शुरू करना चाहता हूं जहां साइनअप / साइन इन फॉर्म मौजूद है .. यह कैसे संभव होगा?
pblead26

1
पूर्व किटकैट संस्करण के लिए यह उत्तर देखें: stackoverflow.com/a/23470355/3256989
13

2
क्या इस कोड को लागू करने के बाद किसी अन्य गतिविधि को शुरू करना संभव है
अमनदीप रोहिला

107

मैं बस इस पोस्ट में यहाँ पोस्ट किए गए लिंक 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 () कॉल करना होगा। clearApplicationData () onClickListener के भीतर से

अद्यतन: आपका SharedPreferencesउदाहरण आपके डेटा को पकड़ सकता है और इसे हटाने के बाद वरीयताओं की फ़ाइल को फिर से बना सकता है। तो आपका अपना SharedPreferencesउद्देश्य प्राप्त करना चाहते हैं और

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

अपडेट करें:

यदि आपने ऐसा नहीं किया है, तो आपको AndroidManifest.xml android:name="your.package.MyApplication"के application tagअंदर जोड़ना होगा । एल्स, MyApplication.getInstance()रिटर्न null, परिणामस्वरूप NullPointerException


5
ख्याल रखना ! आप शेयर प्राथमिकताएं सहित ऐप फ़ोल्डर में हर हटाते हैं .. न केवल कैश स्वयं और इसकी सामग्री को भी।
Snicolas

2
मैंने इस समाधान को लागू किया है। लेकिन मेरा एप्लीकेशन डेटा क्लियर नहीं है केवल कैश क्लियर हुआ है .. 5 एमबी अभी भी बाकी है .. कोई और उपाय ?? कृपया मेरी मदद करें :(
स्वीटविशर '

1
@ मिस्मन कृपया उल्लेख करें कि इसे कक्षा में लिखा जाना चाहिए जो बेहतर प्रभाव के लिए आवेदन का विस्तार करता है
creepy_driver

लिबास डीर रखने के लिए बहुत स्मार्ट।
१४:३१

1
हाँ, इसने सभी फाइलों को हटा दिया, लेकिन ऐप को इसका एहसास नहीं हुआ, इसलिए मैं अभी भी ऐप डीआईआर पर फाइलें रख सकता था। ऐप ने हाल ही में ऐप थ्रेन से ऐप को हटाने के बाद समाशोधन का एहसास किया। मैंने गतिविधि को फिर से बनाने की कोशिश की, लेकिन यह काम नहीं हुआ
gturedi

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 संस्करण हो? मेरे लिए, यह (लॉलीपॉप, Marshmallow और पाई के साथ) सभी 3 Android उपकरणों पर मेरा अधिकार पर काम करता है
Kathir

हाँ अगर किट केट के बराबर या उससे कम के लिए है ... क्लियर अप्प्लीकेशन यूज़रडाटा का उपयोग करें और इसके ऊपर रनटाइम.नेक्स का उपयोग करता है ... मूल रूप से एक शेल कमांड ... अनुमतियों के अलावा बहुत विश्वसनीय ... यह बस काम करना चाहिए ...
CrandellWS

13

ऐसा करने का सबसे सरल तरीका है

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) का उपयोग करना जो मौजूद नहीं हो सकता है जोखिम भरा है। वे एंड्रॉइड एसडीके "अनुबंध" का हिस्सा नहीं हैं, और इसलिए क्या वे किसी दिए गए डिवाइस पर मौजूद हैं या क्या वे उसी तरह का व्यवहार करते हैं जैसा वे अन्य उपकरणों पर करते हैं निर्माताओं और कस्टम रॉम डेवलपर्स पर निर्भर है।
कॉमन्सवेयर

2
एक विकल्प के रूप में मेरे पास एक और विकल्प है (यानी (गतिविधि प्रबंधक) संदर्भ ।getSystemService (ACTIVITY_SERVICE)) .clearApplicationUserData (); लेकिन इसकी एक सीमा है कि यह केवल एपीआई स्तर> = 19 पर काम करता है। क्या आप कृपया यहां कोई विकल्प प्रदान कर सकते हैं या कोई अन्य विकल्प हो सकता है।
12

2

मैं हर जगह क्या उपयोग करता हूं:

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

कोड के ऊपर के निष्पादन को लागू करने से आवेदन बंद हो जाता है और सभी डेटाबेस और साझा प्राथमिकताएं हटा दी जाती हैं


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.