【问题标题】:I am unable to get Shared Preferences of other application我无法获得其他应用程序的共享首选项
【发布时间】:2013-08-06 17:01:34
【问题描述】:

我是 Android 新手。我正在尝试在另一个应用程序中访问一个应用程序的 SharedPreferences。 但我没有得到这些值。

我的代码贴在下面。

SharedPref1 中的 Create.java

package com.example.sharedpref1;

public class Create extends Activity implements OnClickListener{

    EditText et1,et2;
    Button btn;
    String LogID,Pwd;
    public SharedPreferences loginDetails;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.create);

        et1 = (EditText)findViewById(R.id.etC1);
        et2 = (EditText)findViewById(R.id.etC2);
        btn = (Button)findViewById(R.id.bCreate);
        loginDetails = getSharedPreferences("logid", MODE_WORLD_READABLE);

        btn.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {

        if(v.getId() == R.id.bCreate)
        {
            LogID = et1.getText().toString();
            Pwd = et2.getText().toString();
            Toast.makeText(getApplicationContext(), "User Profile Createad With\nUser ID: "+LogID +"\nPassword: "+Pwd, Toast.LENGTH_LONG).show();
            SharedPreferences.Editor store = loginDetails.edit();
            store.putString("logid", LogID);
            store.putString("pass", Pwd);
            store.commit();

            finish();

        }
    }
}

SharedPref2 中的 Show.java

package com.example.sharedpref2;

public class Show  extends Activity implements OnClickListener{

    EditText log,pwd;
    Button back;
    public SharedPreferences loginDetails;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.show);

        log = (EditText)findViewById(R.id.etid);
        pwd = (EditText)findViewById(R.id.etPwd);
        back = (Button)findViewById(R.id.bBack);

        back.setOnClickListener(this);

        loginDetails = getSharedPreferences("logid", MODE_WORLD_READABLE);

        log.setText(loginDetails.getString("logid", "defValue"));
        pwd.setText(loginDetails.getString("pass", "defValue"));
    }

    }

我得到的值如下

【问题讨论】:

    标签: android sharedpreferences android-sharing


    【解决方案1】:

    我正在尝试在另一个应用程序中访问一个应用程序的 SharedPreferences。

    这是个坏主意。引用the documentation for MODE_MULTI_PROCESS:

    SharedPreference 加载标志:设置后,即使在此过程中已经加载了共享首选项实例,也会检查磁盘上的文件是否有修改。在应用程序有多个进程,所有进程都写入同一个 SharedPreferences 文件的情况下,有时需要这种行为。 不过,通常进程之间存在更好的通信形式。

    (强调)

    此外,唯一可行的方法是创建SharedPreferences MODE_WORLD_READABLE,这意味着任何应用都可以访问这些偏好。有才华的程序员不会这样做,而是会使用其他 IPC 机制,将两个应用程序之间的通信限制在并且只有在用户许可的情况下,以免将用户数据泄露给其他人。

    最后,您没有任何可以跨进程工作的代码。 getSharedPreferences() 将获得您自己的进程的首选项。我能想到的从 another 进程获取SharedPreferences 的唯一方法是在通过createPackageContext() 创建的Context 上调用getSharedPreferences(),我还没有尝试过这个,因为我不会梦想实施您的提议。

    【讨论】:

    【解决方案2】:

    如果您需要在应用程序之间共享内容,我建议您使用内容提供程序而不是 SharedPrefrences。根据我的经验,SharedPrefernces 在这些情况下是不可靠的。

    MODE_WORLD_READABLE 在 API 级别 17 中已弃用。 http://developer.android.com/reference/android/content/Context.html#MODE_WORLD_READABLE

    【讨论】:

      猜你喜欢
      • 2011-08-27
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      相关资源
      最近更新 更多