วิธีลบการตั้งค่าที่ใช้ร่วมกันในขณะที่ถอนการติดตั้งแอปพลิเคชันใน Android


105

ฉันมีแอปพลิเคชัน Android เพื่อบันทึกรายละเอียดการเข้าสู่ระบบเช่นชื่อผู้ใช้และรหัสผ่านซึ่งใช้SharedPreferencesงานได้ดี แต่ฉันจำเป็นต้องลบที่ใช้ทั้งหมดSharedPreferencesในขณะที่ถอนการติดตั้งแอปพลิเคชัน ทำอย่างไร?

SavePreferences("one ", "");
SavePreferences("two", "");
LoadPreferences();

 private void SavePreferences(String key, String value){
    sharedPreferences = getSharedPreferences("TEST", MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(key, value);
    editor.commit();
   }

 private void LoadPreferences(){
    sharedPreferences = getSharedPreferences("TEST", MODE_PRIVATE);
    String strSavedMem1 = sharedPreferences.getString("MEM1", "");
    String strSavedMem2 = sharedPreferences.getString("MEM2", "");   
   } 

ฉันต้องการลบสิ่งนี้SharedPreferencesเมื่อถอนการติดตั้งแอปพลิเคชันของฉัน


11
สิ่งนี้จะถูกลบออกโดยอัตโนมัติโดย Android OS เมื่อถอนการติดตั้งแอปพลิเคชัน ...
umair.ali

ขอบคุณสำหรับรายละเอียดที่
คุ้มค่า

ไม่ได้อยู่ใน Samsung Galaxy 1 (Froyo) ที่รูทของฉัน ยังคงอยู่ใน/dbdata/database/my.package/shared_prefs. ไม่รู้ว่าเป็นเพราะมันรูทหรือเพราะ Froyo ยังไม่สามารถทดสอบกับอุปกรณ์รุ่นใหม่
Nilzor

คำตอบ:


20

SharedPreferences จะถูกลบไปพร้อมกับการถอนการติดตั้งแอปเสมอ

เมื่อคุณถอนการติดตั้งแอปพลิเคชันใด ๆ การเปลี่ยนแปลงทั้งหมดที่แอปพลิเคชันได้ทำในหน่วยความจำภายในของคุณจะถูกเพิกถอนนั่นหมายความว่าไฟล์ SharedPreference ของคุณไฟล์ข้อมูลอื่น ๆ ไฟล์ฐานข้อมูลแอปพลิเคชันจะถูกลบโดยอัตโนมัติโดย Android OS

แก้ไข: 29/04/15: for> = 21 API อ้างอิงคำตอบของ @Maher Abuthraa


11
ไม่ใช่เคสบน Nexus 6P ที่หาข้อมูลนี้ได้ในตอนนี้
AndyRoid

1
ใช่ฉันยังสังเกตเห็นใน Nexus 5 ที่ทำงานด้วย Android 6 ไม่ได้ลบค่ากำหนดที่ใช้ร่วมกัน ฉันต้องรีสตาร์ทอุปกรณ์หลังจากถอนการติดตั้งและการตั้งค่าที่ใช้ร่วมกันก็หายไปแล้ว
Santhana

2
Galaxy s7 ที่นี่มีปัญหาเดียวกัน ฉันถอนการติดตั้งและหลังจากติดตั้งค่ากำหนดที่ใช้ร่วมกันยังคงตั้งค่าไว้ น่ารำคาญจริงๆเพราะฉันไม่สามารถทดสอบการติดตั้งใหม่ได้เพียงแค่ถอนการติดตั้ง
Dpedrinha

2
@Maher Abuthraa มีคำตอบที่ถูกต้องคำตอบนี้ผิด
ЮрійМазуревич

1
อุปกรณ์ Samsung s8 s8 + ไม่ลบค่ากำหนดที่ใช้ร่วมกันฉันเพิ่งทดสอบ ผิดหวังจริงๆกับ Samsung
Vrajesh

302

ปัญหาไม่ได้อยู่ที่ความชอบ เป็นผู้จัดการสำรองอย่างมาก! .. ตั้งแต่ android-23 โดยค่าเริ่มต้นการสำรองข้อมูลเนื่องจากงานจะจัดเก็บข้อมูลของแอปรวมถึงค่ากำหนดไปยังระบบคลาวด์ ในภายหลังเมื่อคุณถอนการติดตั้งแล้วให้ติดตั้งเวอร์ชันที่ใหม่กว่าคุณอาจจะใช้การตั้งค่าการกู้คืน เพื่อหลีกเลี่ยงสิ่งนั้นเพียงเพิ่มสิ่งนี้ลงในไฟล์ Manifest ของคุณ (หรืออย่างน้อยก็เพื่อแก้ไขข้อบกพร่องในรายการ):

<application ...
        android:allowBackup="false">
...
</application>

อ่านสิ่งนี้: http://developer.android.com/guide/topics/data/backup.html

คุณจะเห็นว่าถ้าคุณเรียกใช้ Lint ภายใต้Android > Lint > Security:

คำเตือนผ้าสำลีในการสำรองข้อมูล

เป็นเรื่องดีที่จะกล่าวถึงที่นี่ว่ากระบวนการสำรองข้อมูลก็เหมือนกล่องดำ .. คุณไม่รู้ว่าเมื่อใดเริ่มต้นและช่วงระหว่างการตรวจสอบ ... ดีกว่าสำหรับการพัฒนาเพื่อปิดใช้งาน

==== อัปเดต ====

คุณอาจได้รับประเด็นการควบรวมกิจการ Manifest หลังจากการตั้งค่าไปallowbackup falseในการแก้ไขปัญหานั้นให้เพิ่ม:

tools:replace="android:allowBackup"

ในองค์ประกอบแอปพลิเคชัน เครดิต @ shahzain-ali

หรือคุณสามารถล้างแคชก่อนถอนการติดตั้งแอพ

ฉันหวังว่าอาจช่วยได้


4
เฮ้ฉันสังเกตเห็นว่าในบางอุปกรณ์การตั้งค่าที่ใช้ร่วมกันจะยังคงอยู่หลังจากที่ unistall ใช้อุปกรณ์จะถูกรีสตาร์ท ที่เชื่อมต่อกับสิ่งนี้หรือไม่? หากเป็นเช่นนั้นการตั้งค่าสถานะนี้เป็นเท็จในแอปที่ใช้งานจริงจะปลอดภัยหรือไม่ จะมีผลต่อผู้ใช้หรือไม่?
Eliahu Horwitz

ไม่แนะนำให้ตั้งค่าเป็นเท็จในการใช้งานจริงผู้ใช้จะสูญเสียการตั้งค่าทั้งหมดในระหว่างการอัปเดต .. ดีกว่าในการใช้งานจริงในการโยกย้ายข้อมูลหากจำเป็น .. ในโค้ดดีบักและค่ากำหนดอาจมีการเปลี่ยนแปลงหลายครั้งซึ่งจะดีกว่าในการปิดการสำรองข้อมูล
Maher Abuthraa

1
ความรุ่งโรจน์ @MaherAbuthraa .. ฉันประสบปัญหานี้ของข้อมูลการตั้งค่าที่ใช้ร่วมกันบางอย่างถูกเก็บไว้หลังจากถอนการติดตั้งและติดตั้งแอปใหม่ ไม่เคยรู้มาก่อนว่ากำลังทำสิ่งนั้นอยู่
SoulRayder

1
ขอบคุณมาก! คุณช่วยชีวิตฉัน.
hungtdo

ฉันจะแน่ใจได้อย่างไรว่าค่ากำหนดจะถูกคงไว้ในระหว่างการอัปเดต แต่ถูกลบออกเมื่อถอนการติดตั้งด้วยตนเอง แน่นอนว่านี่จะเป็นพฤติกรรมที่คาดหวัง
Gannet

11

มันแปลก แต่ฉันพบวิธีแก้ปัญหาด้วยวิธีต่อไปนี้:

  1. เพิ่มxmlns:tools="http://schemas.android.com/tools"ในแท็กอย่างชัดแจ้งของManifest.xmlไฟล์
  2. เพิ่มandroid:allowBackup="false"ในแท็กแอปพลิเคชันของไฟล์Manifest.xml
  3. เพิ่มtools:replace="android:allowBackup"ในแท็กแอปพลิเคชันของไฟล์Manifest.xml

ไฟล์Manifest.xmlควรมีลักษณะดังนี้

    <?xml version="1.0" encoding="utf-8"?><!--suppress ALL -->
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="com.package">

        // Other code

    <application
        android:name="com.package.Application"
        android:allowBackup="false"
        android:hardwareAccelerated="true"
        android:icon="@drawable/appicon"
        android:label="@string/application_name"
        android:largeHeap="true"
        android:theme="@style/AppTheme"
        tools:replace="android:allowBackup">

        <activity
            android:name="com.package.SplashActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/application_name"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        // Other code

    </application>

    </manifest>

มันจบแล้ว.


2
ปัญหาของคุณคือหนึ่งในโมดูลของคุณ / AAR มี android: allowBackup = "true" .. นั่นเป็นเหตุผลที่คุณต้องตั้งค่าอีกครั้งด้วยเครื่องมือแอตทริบิวต์: แทนที่
Maher Abuthraa

แม้ว่าฉันจะเก็บตัวandroid:allowBackup="false"และtools:replace="android:allowBackup"ยังคงได้รับการตั้งค่าก็ตามคิดว่าปัญหาคืออะไร?
Shylendra Madda

ฉันยังได้รับปัญหาเดียวกัน หลังจากเพิ่มรหัสนี้ไม่สามารถล้างการกำหนดล่วงหน้าได้
Pawan Soni



0

ค่ากำหนดที่ใช้ร่วมกันจะไม่ถูกลบอีกต่อไปเมื่อเป็นมาร์ชเมลโล่ เพิ่มบรรทัดนี้ในรายการของคุณ: "android: allowBackup =" false ""

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.