-1

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

我的代码发布在下面。

在 SharedPref1 中创建.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"));
    }

    }

我得到的值如下 在此处输入图像描述

4

2 回答 2

1

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

这是一个坏主意。引用文档MODE_MULTI_PROCESS

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

(重点补充)

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

最后,您没有任何可以跨进程工作的代码。getSharedPreferences()将获得您自己的流程的偏好。SharedPreferences我能想到的从另一个进程中获取 a 的唯一方法是getSharedPreferences()调用Contextcreated via createPackageContext(),我还没有尝试过,因为我不会梦想实现你的提议。

于 2013-08-06T17:22:57.463 回答
0

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

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

于 2013-08-06T17:45:24.743 回答