获取所有SharedPreferences名称及其所有密钥?

时间:2011-07-13 00:44:52

标签: android backup sharedpreferences

我正在制作备份程序,将手机SharedPreferences数据保存到我自己的结构文件中。但我不知道如何列出所有这些,我需要:

例如,2个程序使用名称"Program A""Program B"保存了其SharedPreferences。我需要获取thay String数组包含这两个名字。然后,我使用getSharedPreferences和“程序A”,我需要获得程序保存的所有密钥。

真的有可能吗?

EDIT1:我不知道手机上的节目/活动。我希望获得每个程序保存的所有keys。就像您备份所有手机数据一样,但只备份SharedPreferences值。

例如:您的手机有10个程序,每个程序创建一个名为Program 1Program 10的SharedPreferences(但当然,无论他们想要什么名字)。我想获得所有这些Program 1Program 10字符串。然后,如果Program 1有5个名为Key 1Key 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));
    }



}

6 个答案:

答案 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", ""));
        }
    }
}