Android第八课--数据共享

共享preference可在一个应用程序的各个组件之间共享。

在MainActivity里面创建并保存preference:

package zcy.org;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {
	public static final String MYPREFS="mySharedPreference";
	EditText et;
	Button bt;
	float f;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        et=(EditText)findViewById(R.id.myEditText);  
        bt=(Button)findViewById(R.id.myButton);
        bt.setOnClickListener(new OnClickListener(){
			public void onClick(View arg0) {
				Intent intent=new Intent(MainActivity.this,SecActivity.class);
				savePreference();
				startActivity(intent);
			}
        });
    }
    
    protected void savePreference(){
    	int mode=Activity.MODE_PRIVATE;
    	//创建或检索共享的preference对象
    	SharedPreferences mySharedPreference=getSharedPreferences(MYPREFS,mode);
    	//找一个编辑器来修改共享的preference
    	SharedPreferences.Editor editor=mySharedPreference.edit();
    	//在共享的preference对象中存储新的原语类型
    	editor.putBoolean("isTrue",true);
    	f=Float.parseFloat(et.getText().toString());
    	editor.putFloat("lastFloat",f);
    	//提交更改
    	editor.commit();
    }
}

在SecActivity里面读取preference

package zcy.org;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.TextView;

public class SecActivity extends Activity{
	private TextView tv;
	boolean isTrue;
	float lastFloat;
	@Override
	public void onCreate(Bundle outState){
		super.onCreate(outState);
		setContentView(R.layout.main2);
		tv=(TextView)findViewById(R.id.tv);
		loadPreference();
		if(isTrue){
			tv.setText(Float.toString(lastFloat));
		}
	}
	public void loadPreference(){
		int mode=Activity.MODE_PRIVATE;
		//获取存储的preference
		SharedPreferences mySharedPreference=getSharedPreferences(MainActivity.MYPREFS,mode);
		//检索保存的值
		isTrue=mySharedPreference.getBoolean("isTrue",false);
		lastFloat=mySharedPreference.getFloat("lastFloat",0f);
	}

}

以上讲的方法可以在一个应用程序的不同Activity之间共享变量,如果只是想保存一个活动的状态,而不需要和其他活动共享,则可以使用Activity.getPreference()。

getPreferences()只需要一个mode参数,而getSharedPreferences()还需要另外指定名称。

package zcy.org;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {
	EditText et;
	Button bt;
	float f;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        et=(EditText)findViewById(R.id.myEditText);  
        //获取存储的preference
		SharedPreferences mySharedPreference=getPreferences(Activity.MODE_PRIVATE);
		//检索保存的值
		f=mySharedPreference.getFloat("lastFloat",0f);
		et.setText(Float.toString(f));
        bt=(Button)findViewById(R.id.myButton);
        bt.setOnClickListener(new OnClickListener(){
			public void onClick(View arg0) {
				Intent intent=new Intent(MainActivity.this,SecActivity.class);
				//在活动跳转之前保存本活动的preference
				savePreference();
				startActivity(intent);
			}
        });
    }
    
    protected void savePreference(){
    	int mode=Activity.MODE_PRIVATE;
    	//创建或检索活动的preference对象
    	SharedPreferences mySharedPreference=getPreferences(mode);
    	//找一个编辑器来修改共享的preference
    	SharedPreferences.Editor editor=mySharedPreference.edit();
    	//在共享的preference对象中存储新的原语类型
    	f=Float.parseFloat(et.getText().toString());
    	editor.putFloat("lastFloat",f);
    	//提交更改
    	editor.commit();
    }
}

当从其他活动跳转回MainActivity时,EditText中的值是之前输入的值。

通过重写onSaveInstanceState来保存活动实例的值,把修改过的Bundle传递给超类的处理函数。

当活动已完成它的生命周期但还没有显示的结束时,就会触发 onSaveInstanceState这个函数。这样就可以保证在用户一次会话的生命周期中保持一致的活动状态。

如果活动被强制重启,那么已保存的Bundle就会被传递到onRestoreInstanceState和onCreate方法中。

注意只有当活动变为不活动状态的时候才会调用onRestoreInstanceState,而当活动通过调用finish或用户按返回键而被关闭时是不会调用onRestoreInstanceState的。

package zcy.org;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class SecActivity extends Activity{
	private Button bt;
	EditText tv;
	private static final String TEXTVIEW_STATE_KEY="TEXTVIEW_STATE_KEY";
	@Override
	public void onSaveInstanceState(Bundle outState){
		//检索View
		tv=(EditText)findViewById(R.id.sectv);
		//保存View的状态
		outState.putString(TEXTVIEW_STATE_KEY,tv.getText().toString());
		super.onSaveInstanceState(outState);
	}
	@Override
	public void onCreate(Bundle icicle){
		super.onCreate(icicle);
		setContentView(R.layout.main2);
		tv=(EditText)findViewById(R.id.sectv);
		String text="";
		if(icicle!=null&&icicle.containsKey(TEXTVIEW_STATE_KEY))
			text=icicle.getString(TEXTVIEW_STATE_KEY);
		tv.setText(text);
		bt=(Button)findViewById(R.id.bt);
        bt.setOnClickListener(new OnClickListener(){
			public void onClick(View arg0) {
				Intent intent=new Intent(SecActivity.this,MainActivity.class);
				startActivity(intent);
			}
        });
	}
}

在SecActivity中输入“zcy”,如果紧接着重启应用程序,则直接进入 SecActivity页面,并且EditText中还显示"zcy"。

而如果在 SecActivity中按back按钮(  这时SecActivity就调用了finish())回到MainActivity,再从 MainActivity进入 SecActivity时,EditText中就为空了。

文件

除了标准的Java I/O类外,Android提供openFileInput和openFileOutput以简化对本地文件流的读写。这些方法只支持当前文件夹下的文件,指定文件时给出路径会抛出异常。

String FILE_NAME="tempfile";

FileOutputStream fos=openFileOutput(FILE_NAME,Context.MODE_PRIVATE);

FileInputStream fis=openFileInput(FILE_NAME);

Context.MODE_PRIVATE指明文件为当前应用程序私有,文件不存在时会创建,存在时会覆盖;

Context.MODE_APPEND追加的形式;

Context.MODE_WORLD_READABLE,Context.MODE_WORLD_WRITEABLE其他程序可访问。
将静态文件作为资源:

把外部文件放在res/raw下面

Resource myResource=getResources();

InputStream myFile=myResource.openRawResource(R.raw.filename);


Android还提供deleteFile(删除当前应用程序创建的文件)和fileList(返回当前应用程序创建的文件列表的字符串数组)。

posted @ 2011-02-21 16:06  高性能golang  阅读(2297)  评论(1编辑  收藏  举报