删除并安装应用程序后返回共享首选项

时间:2014-07-31 08:44:31

标签: android save backup sharedpreferences

朋友,我正在尝试制作游戏,我需要创建我游戏的演示版

我需要一个按钮,当用户点击它时游戏运行但只有3次。

3次用户点击按钮后,应用程序显示消息"你应该购买游戏"

我使用了共享偏好。 3点击按钮后,游戏显示消息,但当用户删除应用程序并再次安装时,游戏不显示消息并运行游戏。

有没有办法在删除应用程序后保存共享偏好? 这是我的代码:                            

     Button frist = ((Button)findViewById(R.id.test));
               final SharedPreferences check = getSharedPreferences("check",MODE_PRIVATE);
               final Editor edit = check.edit();

frist.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { if(check.getInt("check1",0)<3){ Intent intent = new Intent(MainActivity.this,choose_name.class ); startActivity(intent); edit.putInt("check1", check.getInt("check1",0)+1).commit(); } } });

编辑:朋友即时尝试编写文件并将我的设置保存到其中,我可以将文件保存在用户无法看到它的任何目录中,并且我的文件在用户删除应用程序后不会删除而且我不需要使用权限吗? / p>

4 个答案:

答案 0 :(得分:4)

尝试 Backing up and restoring a user’s SharedPreferences 。这会将您的偏好备份到任何外部存储空间

在用户卸载应用之前,您可以备份它。添加一些逻辑,如果外部存储中存在文件,请将其还原。

修改

使用以下代码支持您的偏好。

  

存储在SharedPreferences类中的首选项保存到/data/data//shared_prefs/_preferences.xml中 - 备份很简单,只需将此文件的内容复制到外部存储:

public static void backupUserPrefs(Context context) {
    final File prefsFile = new File(context.getFilesDir(), "../shared_prefs/" + context.getPackageName() + "_preferences.xml");
    final File backupFile = new File(context.getExternalFilesDir(null),
        "preferenceBackup.xml");
    String error = "";

    try {
        FileChannel src = new FileInputStream(prefsFile).getChannel();
        FileChannel dst = new FileOutputStream(backupFile).getChannel();

        dst.transferFrom(src, 0, src.size());

        src.close();
        dst.close();

        Toast toast = Toast.makeText(context, "Backed up user prefs to " + backupFile.getAbsolutePath(), Toast.LENGTH_SHORT);
        toast.show();
        return;
    } catch (FileNotFoundException e) {
        error = e.getMessage();
        e.printStackTrace();
    } catch (IOException e) {
        error = e.getMessage();
        e.printStackTrace();
    }

使用以下代码恢复首选项

  

但是,恢复提供了更多挑战,因为应用程序无法直接写入shared_prefs文件,并且SharedPrefs类不会直接将其功能公开给xml进行序列化。相反,你必须自己解析XML并将值推回。谢天谢地,XML文件具有简单的结构,因此很容易循环遍历元素并将它们转换回首选项。

public static boolean restoreUserPrefs(Context context) {
    final File backupFile = new File(context.getExternalFilesDir(null),
        "preferenceBackup.xml");
    String error = "";

    try {

        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);

        Editor editor = sharedPreferences.edit();

        InputStream inputStream = new FileInputStream(backupFile);

        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

        Document doc = docBuilder.parse(inputStream);
        Element root = doc.getDocumentElement();

        Node child = root.getFirstChild();
        while (child != null) {
            if (child.getNodeType() == Node.ELEMENT_NODE) {

                Element element = (Element) child;

                String type = element.getNodeName();
                String name = element.getAttribute("name");

                // In my app, all prefs seem to get serialized as either "string" or
                // "boolean" - this will need expanding if yours uses any other types!    
                if (type.equals("string")) {
                    String value = element.getTextContent();
                    editor.putString(name, value);
                } else if (type.equals("boolean")) {
                    String value = element.getAttribute("value");
                    editor.putBoolean(name, value.equals("true"));
                }
            }

            child = child.getNextSibling();

        }

        editor.commit();

        Toast toast = Toast.makeText(context, "Restored user prefs from " + backupFile.getAbsolutePath(), Toast.LENGTH_SHORT);
        toast.show();

        return true;

    } catch (FileNotFoundException e) {
        error = e.getMessage();
        e.printStackTrace();
    } catch (ParserConfigurationException e) {
        error = e.getMessage();
        e.printStackTrace();
    } catch (SAXException e) {
        error = e.getMessage();
        e.printStackTrace();
    } catch (IOException e) {
        error = e.getMessage();
        e.printStackTrace();
    }

    Toast toast = Toast.makeText(context, "Failed to restore user prefs from " + backupFile.getAbsolutePath() + " - " + error, Toast.LENGTH_SHORT);
    toast.show();

    return false;
}


    Toast toast = Toast.makeText(context, "Failed to Back up user prefs to " + backupFile.getAbsolutePath() + " - " + error, Toast.LENGTH_SHORT);
    toast.show();

}
  

最后,您需要重新启动应用,然后才能保留这些偏好设置:

if (restoreUserPrefs(context)) {
    // Restart              
    AlarmManager alm = (AlarmManager) context.getSystemService(
    Context.ALARM_SERVICE);
    alm.set(AlarmManager.RTC,
    System.currentTimeMillis() + 1000, PendingIntent.getActivity(context, 0,
    new Intent(context, MainActivityName.class), 0));
    android.os.Process.sendSignal(android.os.Process.myPid(),
    android.os.Process.SIGNAL_KILL);
}

答案 1 :(得分:0)

卸载应用时会删除SharedPreferences,因此不会:SharedPreferences不是此处的最佳选择。我建议使用某种远程数据库来跟踪应用程序的使用情况。

答案 2 :(得分:0)

如果用户通过设置卸载/删除应用程序或清理数据,那么共享首选项中的所有数据都将消失

你的问题是当用户做了这样的事情,你的应用程序共享偏好值从0 /起始值初始化

你可以使用webservice for ex。您可以通过代码获取用户IMEI号码,并且可以保存其共享偏好值&#34;比赛数量&#34; 然后通过智能逻辑​​检查您的要求

Android提供了几种保存持久性应用程序数据的选项。您选择的解决方案取决于您的特定需求,例如数据是应该是您的应用程序专用还是其他应用程序(和用户)可访问的数据以及数据所需的空间大小。

您的数据存储选项如下:

共享首选项将私有原始数据存储在键值对中。

内部存储将私人数据存储在设备内存中。

外部存储将公共数据存储在共享外部存储上。

SQLite数据库将结构化数据存储在私有数据库中。

网络连接使用您自己的网络服务器在网络上存储数据。

Android提供了一种方法,您可以使用内容提供商将您的私人数据公开给其他应用程序。内容提供程序是一个可选组件,它公开对应用程序数据的读/写访问权限,但要受限于您要强制执行的任何限制。有关使用内容提供程序的详细信息,请参阅内容提供程序文档。

答案 3 :(得分:0)

Shared Preferences始终与卸载应用一起清除。但是由于 android-21 备份任务默认将首选项存储到云端。稍后当您卸载然后安装较新版本时。您可能会使用恢复的首选项。您只需将其添加到manifest(或至少是调试清单)。 -

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

阅读本文:http://developer.android.com/guide/topics/data/backup.html

重要的是要提到备份过程是blackbox ..你不知道它什么时候开始,以及检查之间的时间......所以最好开发以禁用它。