删除并安装应用程序后取回共享首选项
Posted
技术标签:
【中文标题】删除并安装应用程序后取回共享首选项【英文标题】:get back sharedpreferences after delete and install app 【发布时间】:2014-07-31 08:44:31 【问题描述】:嗨,朋友,我正在尝试制作游戏,我需要创建我的游戏的演示版
我需要一个按钮,当用户单击它时,游戏会运行但只有 3 次。
用户点击按钮 3 次后,应用显示消息“你应该购买游戏”
我使用了 sharedpreferences 。 3点击按钮后游戏显示消息,但当用户删除应用程序并再次安装时,游戏不显示消息并运行游戏。
删除应用程序后有什么方法可以保存共享首选项? 这是我的代码:
Button fist = ((Button)findViewById(R.id.test));
最终 SharedPreferences check = getSharedPreferences("check",MODE_PRIVATE);
最终编辑器编辑 = 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();
);
编辑:朋友我正在尝试写入文件并将我的设置保存到其中,我可以将我的文件保存在用户看不到它的任何目录中,并且我的文件在用户删除应用程序后不会删除并且我不需要使用权限吗?
【问题讨论】:
不,没有办法。卸载应用程序时会删除 SharedPreferences。新版 inAppBilling 允许您提供试用期 【参考方案1】:试试 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);
【讨论】:
这种方式需要给我的应用添加权限吗? @user3578166 是的.. 外部存储读写权限。 我正在尝试此代码并收到此错误:不存在此类文件或目录 @user3578166 在哪个函数中.. ??备份或恢复时? 请在答案中包含代码 sn-p,因为网站可能会关闭,因此答案会丢失基本信息。【参考方案2】:如果用户通过设置卸载/删除应用或清理数据,则共享偏好中的所有数据都将消失
您的问题是当用户使用您的应用程序共享首选项值从 0/起始值初始化时进行此类操作时
您可以为此使用网络服务。您可以通过代码获取用户的 IMEI 号码,并且您可以保存其“播放次数计数器”的共享偏好值 然后通过智能逻辑检查您的要求
Android 为您提供了多种保存持久应用程序数据的选项。您选择的解决方案取决于您的特定需求,例如数据是否应该对您的应用程序私有或可供其他应用程序(和用户)访问,以及您的数据需要多少空间。
您的数据存储选项如下:
Shared Preferences 将私有原始数据存储在键值对中。
内部存储在设备内存中存储私有数据。
外部存储在共享的外部存储上存储公共数据。
SQLite 数据库将结构化数据存储在私有数据库中。
网络连接 使用您自己的网络服务器在网络上存储数据。
Android 为您提供了一种方法,甚至可以将您的私人数据暴露给其他应用程序 - 使用内容提供程序。内容提供者是一个可选组件,它公开对您的应用程序数据的读/写访问,受您想要施加的任何限制的约束。有关使用内容提供程序的更多信息,请参阅内容提供程序文档。
【讨论】:
androidhive.info/2012/01/… 以上链接用于演示android数据通过webservices(php)与服务器的连接【参考方案3】:当您卸载应用程序时,SharedPreferences 会被删除,所以不会:SharedPreferences 不是这里的最佳选择。我建议使用某种远程数据库来跟踪您的应用程序的使用情况。
【讨论】:
好吧,我无法提供用于创建数据库连接的全部源代码,但可以在网上找到很多关于此主题的信息。您可以设置 mysql 数据库并使用 Web 服务与它进行通信,或者使用 Parse.com 等更简单的服务来轻松连接到数据库。【参考方案4】:Shared Preferences
总是在卸载应用程序时被清除。但由于 android-21 备份任务默认将首选项存储到云端。稍后当您卸载然后安装更新版本。您可能会使用恢复的首选项。您只需将其添加到您的 manifest
(或至少用于调试的清单)。 -
<application ...
android:allowBackup="true">
...
</application>
阅读:http://developer.android.com/guide/topics/data/backup.html
重要的是在这里提到备份过程是黑盒..你不知道它什么时候开始,以及检查之间的时间......所以最好开发禁用它。
【讨论】:
以上是关于删除并安装应用程序后取回共享首选项的主要内容,如果未能解决你的问题,请参考以下文章