很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的QQ,用户可以设置是否允许陌生人添加自己为好友。
对于软件配置参数的保存,如果是Windows软件通常我们会采用ini文件进行保存;
如果是j2se,我们会采用properties属性文件或者xml进行保存;
如果是Android应用,我们最适合采用什么方式保存软件配置参数呢?
Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。
使用SharedPreferences保存数据,其背后使用xml文件存放数据,文件存放在/data/data/<package name>/shared_prefs目录下。
保存参数&回显参数:
1.实现布局:
代码—actvity_main.xml:
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android:orientation="vertical" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 > 6 7 <TextView 8 android:layout_width="wrap_content" 9 android:layout_height="wrap_content" 10 android:text="@string/name" /> 11 12 <EditText 13 android:layout_width="match_parent" 14 android:layout_height="wrap_content" 15 android:id="@+id/name" /> 16 17 <TextView 18 android:layout_width="wrap_content" 19 android:layout_height="wrap_content" 20 android:text="@string/age" /> 21 22 <EditText 23 android:layout_width="match_parent" 24 android:layout_height="wrap_content" 25 android:numeric="integer" 26 android:id="@+id/age" /> 27 28 <Button 29 android:layout_width="wrap_content" 30 android:layout_height="wrap_content" 31 android:text="@string/button" 32 android:onClick="save" 33 /> 34 35 </LinearLayout>
string.xml:
1 <?xml version="1.0" encoding="utf-8"?> 2 <resources> 3 4 <string name="app_name">软件参数设置</string> 5 <string name="hello_world">Hello world!</string> 6 <string name="name">姓名</string> 7 <string name="age">年龄</string> 8 <string name="button">保存参数</string> 9 <string name="success">保存完成</string> 10 11 </resources>
2.通过建立一个业务类实现保存和获取数据的功能—PreferencesServiceservice.java:
1 package cn.itcast.service; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 import android.content.Context; 7 import android.content.SharedPreferences; 8 import android.content.SharedPreferences.Editor; 9 10 11 public class PreferencesServiceservice { 12 private Context context; 13 14 public PreferencesServiceservice(Context context) { 15 this.context = context; 16 } 17 18 public void save(String name, Integer age) { 19 //由于我们采用SharedPreferences来保存参数,所以首先获得SharedPerences这个类型的对象 20 //这个类型的对象的取得,我们要通过上下文对象来得到,所以首先引入上下文对象 21 //上下文对象我们通过构造器传入进来,然后在此处调用上下文对象中的getSharedPreferences() 22 SharedPreferences preferences = context.getSharedPreferences("itcast", Context.MODE_PRIVATE);//文件名称(不要后缀),操作模式 23 //得到了这个对象后,我们就可以利用它提供的API向里面存放数据了 24 //先取得编辑器后,通过编辑器对象存放数据 25 Editor editor = preferences.edit(); 26 //然后调用它的常用类型put方法,往servePreference里面存放数据 27 editor.putString("name",name); 28 editor.putInt("age",age); 29 //目前这两项参数是保存在内存中的,还没有真正的保存在文件中 30 editor.commit();//提交方法,把内存中存放的数据,提交回文件中,完成数据的保存 31 } 32 33 //获取SharedPreferences保存的参数 34 //再定义一个业务 35 /** 36 * 获取各项配置参数 37 * @return 38 */ 39 public Map<String,String> getPreferences() 40 { 41 Map<String,String> params = new HashMap<String,String>(); 42 //首先取得SharedPreferences 的对象 43 SharedPreferences preferences = context.getSharedPreferences("itcast", Context.MODE_PRIVATE); 44 params.put("name", preferences.getString("name", "")); 45 params.put("age", String.valueOf(preferences.getInt("age", 0))); 46 return params; 47 } 48 }
3.在主活动中调用该保存和回显参数的功能—MainActivity.java:
1 package cn.itcast.setting; 2 3 import java.util.Map; 4 5 import cn.itcast.service.PreferencesServiceservice; 6 import android.app.Activity; 7 import android.os.Bundle; 8 import android.view.Menu; 9 import android.view.MenuItem; 10 import android.view.View; 11 import android.widget.EditText; 12 import android.widget.Toast; 13 14 public class MainActivity extends Activity { 15 private EditText nameText; 16 private EditText ageText; 17 private PreferencesServiceservice service; 18 19 @Override 20 protected void onCreate(Bundle savedInstanceState) { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.activity_main); 23 nameText = (EditText)this.findViewById(R.id.name); 24 ageText = (EditText)this.findViewById(R.id.age); 25 26 service = new PreferencesServiceservice(this); 27 //回显代码 28 Map<String,String> params = service.getPreferences(); 29 nameText.setText(params.get("name")); 30 ageText.setText(params.get("age")); 31 } 32 33 public void save(View v) 34 { 35 String name = nameText.getText().toString(); 36 String age = ageText.getText().toString(); 37 //点击按钮要保存参数,保存参数的过程就是业务处理的过程 38 //所以我们应该把这段代码写在service层,所以我们写一个类叫做参数service类 39 // PreferencesServiceservice service = new PreferencesServiceservice(this); 40 service.save(name,Integer.valueOf(age)); 41 Toast.makeText(getApplicationContext(), R.string.success, 1).show(); 42 } 43 44 }
注解:
因为SharedPreferences背后是使用xml文件保存数据,getSharedPreferences(name,mode)方法的第一个参数用于指定该文件的名称,名称不用带后缀,
后缀会由Android自动加上。方法的第二个参数指定文件的操作模式,共有4种操作模式。如果希望SharedPreferences背后使用的xml文件能被其他应用读和写,
可以指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。
另外,Activity还提供了另一个getPreferences(mode)方法操作SharedPreferences,这个方法默认使用当前类不带包名的类名作为文件的名称。