先直接上Demo代码
A 应用:存放sharedPreferences值
package com.example.putshare;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SharedPreferences sharedPreferences = getSharedPreferences("demo", Context.MODE_WORLD_READABLE | Context.MODE_PRIVATE);
Editor editor = sharedPreferences.edit();//获取编辑器
editor.putString("name1", "124325");
editor.commit();//提交修改
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
SharedPreferences 保存的值一般都保存在 这个路径:data/data/包名/shared_prefs 如果要查A应用的值有没有保持成功,可以在终端中输入:adb shell ,然后进入(cd)data/data/com.example.putshare/shared_prefs/demo.xml,之后查看(cat)demo.xml里面的值就行了。
B应用:取出sharedPreferences值
package com.example.sharedpreferences;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageManager.NameNotFoundException;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener{
Button btok;
TextView name;
private static final String TARGET_PACKAGE_NAME = "demo";
Context configContext = null;
SharedPreferences share;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btok = (Button) findViewById(R.id.button);
name = (TextView) findViewById(R.id.name);
btok.setOnClickListener(this);
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
switch (arg0.getId()) {
case R.id.button:
try {
configContext = createPackageContext("com.example.putshare", Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);
}catch (NameNotFoundException e) {
e.printStackTrace();
}
share = configContext.getSharedPreferences(TARGET_PACKAGE_NAME,
Context.MODE_WORLD_READABLE);
String currentChannel = share.getString("name1","");
name.setText(currentChannel);//这里显示的是124325
break;
}
}
}
其中com.example.putshare是A应用的包名。关键的部分在于标红的地方。
1:对于跨应用使用sharedPreferences,使用模式Context.MODE_PRIVATE,这样就不能被其他程序访问到
Activity.MODE_PRIVATE:默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中,可以使用Activity.MODE_APPEND
Activity.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取,
Activity.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入;
如果希望文件被其他应用读和写,可以传入:Activity.MODE_WORLD_READABLE+Activity.MODE_WORLD_WRITEABLE
Activity.MODE_APPEND:该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件
所以,这样来说在保存值的时候如果要被外界访问,一定要加上Activity.MODE_WORLD_READABLE,要是被外界改写的话一定要加上Activity.MODE_WORLD_WRITEABLE
2:这里面还有一个关键的地方,就是跨应用获取上下文环境(context),这里用到的是
configContext = createPackageContext("com.example.putshare", Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);
其中Context.CONTEXT_IGNORE_SECURITY这个一定要加上,这个是忽略警告,如果包名没有找到的话会抛出异常。
总之:跨进程获取sharedPreferences值主要是这几个属性的应用,熟悉的话一切都简单多了