我正在制作备份程序,将手机SharedPreferences
数据保存到我自己的结构文件中。但我不知道如何列出所有这些,我需要:
例如,2个程序使用名称"Program A"
和"Program B"
保存了其SharedPreferences。我需要获取thay String数组包含这两个名字。然后,我使用getSharedPreferences
和“程序A”,我需要获得程序保存的所有密钥。
真的有可能吗?
EDIT1:我不知道手机上的节目/活动。我希望获得每个程序保存的所有keys
。就像您备份所有手机数据一样,但只备份SharedPreferences值。
例如:您的手机有10个程序,每个程序创建一个名为Program 1
到Program 10
的SharedPreferences(但当然,无论他们想要什么名字)。我想获得所有这些Program 1
到Program 10
字符串。然后,如果Program 1
有5个名为Key 1
到Key 5
的密钥,我想获取这些密钥名称。
EDIT2:根据NikolaMKD
指南,这是我到目前为止所做的,但是列表返回所有程序,所有行都有“No Preferences”,即使在第一行,我保存了SharedPreferences我的活动:
public class Test extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedPreferences preferences = getSharedPreferences("Test", 1);
// No matter what name is: Test or the package name
Editor editor = preferences.edit();
editor.putInt("TestKey", 0);
editor.commit();
List<ResolveInfo> Temp =
getPackageManager().queryIntentActivities(
new Intent(Intent.ACTION_MAIN, null)
.addCategory(Intent.CATEGORY_LAUNCHER), 0);
String[] App = new String[Temp.size()];
for (int i = 0; i < Temp.size(); i++) {
App[i] = Temp.get(i).activityInfo.name;
FileReader reader = null;
try {
reader = new FileReader("/data/data/"
+ App[i] + "/shared_prefs/" + App[i] + "_preferences.xml");
} catch (FileNotFoundException e) {
reader = null;
}
if (reader != null)
App[i] += " (Have Prefereces)";
else
App[i] += " (No Prefereces)";
}
setListAdapter(new ArrayAdapter<String>(this, R.layout.main, App));
}
}
答案 0 :(得分:10)
从
获取所有_preferences.xml /data/data/(package)/shared_prefs/(package)_preferences.xml
解析XML,在XML中有每个键的名称。我可能会误解你的问题
答案 1 :(得分:3)
不要认为有可能,您无法阅读其他应用/数据/数据/文件夹。在模拟器上,您可以读取它们,因为您具有root访问权限。
答案 2 :(得分:3)
使用返回sharedPreference.getAll();
。{/ p>的Map
答案 3 :(得分:2)
试试这个:
Map<String, ?> allPrefs = prefs.getAll(); //your sharedPreference
Set<String> set = allPrefs.keySet();
for(String s : set){
LOG.d(TAG, s + "<" + allPrefs.get(s).getClass().getSimpleName() +"> = "
+ allPrefs.get(s).toString());
}
答案 4 :(得分:0)
这是一个很好的问题,我不认为有这么简单的方法。最好的方法是将这些名称存储在DefaultSharedPreferences或某种全局数组中,或如果您知道首选项资源ID,则可以从活动本身检索sharedPreferences:
String packageName = String packageName = context.getPackageName();
Resources resources = context.getResources();
String sharedPrefName = resources.getResourceEntryName(R.id.PREFERENCES_RESOURCE_ID);
sharedPrefName = packageName+"_"+sharedPrefName;
答案 5 :(得分:0)
您可以遍历共享首选项目录中的所有xml文件,并获取应用程序中共享首选项名称的所有文件的名称。
File src = new File("/data/data/" + BuildConfig.APPLICATION_ID + "/shared_prefs");
if (src.isDirectory()) {
String files[] = src.list();
for (int i = 0; i < files.length; i++) {
if (files[i].contains(".xml")) {
reloadSharedPreference(context, files[i].replace(".xml", ""));
}
}
}