前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android 四大组件学习之Activity六

Android 四大组件学习之Activity六

作者头像
DragonKingZhu
发布2022-05-08 16:03:07
2870
发布2022-05-08 16:03:07
举报
文章被收录于专栏:Linux内核深入分析

本节学习Activity的状态保存与恢复。

先用例子开始:

布局文件主要是实现如下,大家自行编写

Activity逻辑代码:

代码语言:javascript
复制
public class FiveActivity extends Activity {

	private Button setButton;
	private Button getButton;
	private EditText editText;
	
	private float value;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_five);
	
		setButton = (Button)findViewById(R.id.button1);
		getButton = (Button)findViewById(R.id.button2);
		editText = (EditText)findViewById(R.id.editText1);
		
		setButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				 value = 1.234f;
				editText.setText("hello world");
			}
		});
		
		getButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				String string = editText.getText().toString();
				
				Toast.makeText(FiveActivity.this, string+" "+value, 0).show();
			}
		});
	}
	
	@Override
	protected void onSaveInstanceState(Bundle outState) {
		// TODO Auto-generated method stub
		Log.i("FiveActivity", "onSaveInstanceState");
		super.onSaveInstanceState(outState);
	}
	
}

第一种情况:   按set按钮,并且按get按钮

当然了,这时候按back按钮,当再次进入后,会发现输入框里没有内容,同时按get得到为0.0

同时第一种情况中我的打印Log.i("FiveActivity", "onSaveInstanceState");始终也是没有打印

接着第二种情况:

当我们set后,再按get后。 这次不按Back键,这次按Home键:

当我们按Home键后,我们的Activity就处于stop状态,这时候我们的打印语句出现了

这时候我们手动杀死FiveActivity

这时候在启动Activity,当再次get时就会发现:

EditText中的文字Hello World依旧存在,而我的Value变量变为0.0了。

总结: 

1: 对于第一种情况,Android系统觉得是用户自愿的行为,觉得那就没有保存的必要了。

2: 对于第二种情况,EditText中的文字存在那是因为Android系统中几乎对所以的UI都实现了OnSaveInstanceState方法,这是默认的实现。所以当我们Home出去时就会打印出现,至于我们的变量为啥没有恢复,很明显那是因为没人保存它的值,这就得需要我们程序员自己手动保存。

当我们在OnCreate方法中添加:

代码语言:javascript
复制
		if(savedInstanceState != null)
			value = savedInstanceState.getFloat("1234");
代码语言:javascript
复制
	protected void onSaveInstanceState(Bundle outState) {
		// TODO Auto-generated method stub
		Log.i("FiveActivity", "onSaveInstanceState");
		outState.putFloat("1234", value);
		super.onSaveInstanceState(outState);
	}

这样的话,当杀死进程后,再次进来我们的数据就会正常的出现。

同时, 除系统资源不足时,或者手机的屏幕方向变化时,改变语言时,都会导致Activity重现销毁,然后重现再创建。这时候如果我们不保存需要保存的数据,也会出现不对的情况。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-07-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档