zoukankan      html  css  js  c++  java
  • Android 四大组件学习之Activity六

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

    先用样例開始:

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


    Activity逻辑代码:

    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);
    	}
    	
    }
    
    第一种情况:  
    按setbutton,而且按getbutton


    当然了,这时候按backbutton,当再次进入后,会发现输入框里没有内容。同一时候按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方法中加入:

    		if(savedInstanceState != null)
    			value = savedInstanceState.getFloat("1234");

    	protected void onSaveInstanceState(Bundle outState) {
    		// TODO Auto-generated method stub
    		Log.i("FiveActivity", "onSaveInstanceState");
    		outState.putFloat("1234", value);
    		super.onSaveInstanceState(outState);
    	}

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


    同一时候。 除系统资源不足时,或者手机的屏幕方向变化时,改变语言时,都会导致Activity重现销毁,然后重现再创建。

    这时候假设我们不保存须要保存的数据,也会出现不正确的情况。







  • 相关阅读:
    微博CacheService架构浅析 对底层协议进行适配
    Lucene 查询原理 传统二级索引方案 倒排链合并 倒排索引 跳表 位图
    Linux kernel 同步机制
    对话 CTO〡用声音在一起,听荔枝 CTO 丁宁聊 UGC 声音互动平台的技术世界 原创 王颖奇 极客公园 2018-12-01
    当中台遇上DDD,我们该如何设计微服务?
    京东技术沙龙系列之二 | 深度解析京东微服务组件平台
    gRPC设计动机和原则
    微信全文搜索优化之路
    门户级UGC系统的技术进化路线——新浪新闻评论系统的架构演进和经验总结 提高响应性能的手段归根结底就是三板斧:队列(Queue)、缓存(Cache)和分区(Sharding)
    现加减乘除4则运算
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/7125923.html
Copyright © 2011-2022 走看看