android整合--屏幕旋转触发事件

已经知道怎样设置屏幕显示方向,下面看一下屏幕旋转时触发事件。

先看main.xml

    <?xml version="1.0" encoding="utf-8"?>  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        android:orientation="vertical" >  
    <!-- 注意,这个EditText使用了android:id属性 -->  
    <EditText  
        android:id="@+id/txtField1"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content" />  
    <!-- 注意,这个EditText没有使用android:id属性 -->  
    <EditText  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content" />  
      
    </LinearLayout>  
OrentationsActivity.java。

    public class OrientationsActivity extends Activity {  
        /** Called when the activity is first created. */  
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
            Log.d("StateInfo", "onCreate");  
        }  
          
        @Override  
        public void onStart() {  
            Log.d("StateInfo", "onStart");  
            super.onStart();  
        }  
      
        @Override  
        public void onResume() {  
            Log.d("StateInfo", "onResume");  
            super.onResume();  
        }  
      
        @Override  
        public void onPause() {  
            Log.d("StateInfo", "onPause");  
            super.onPause();  
        }  
      
        @Override  
        public void onStop() {  
            Log.d("StateInfo", "onStop");  
            super.onStop();  
        }  
      
        @Override  
        public void onDestroy() {  
            Log.d("StateInfo", "onDestroy");  
            super.onDestroy();  
        }  
      
        @Override  
        public void onRestart() {  
            Log.d("StateInfo", "onRestart");  
            super.onRestart();  
        }  
      
    }  

在两个EditText中输入一些字符。就像这样。

6. 按Ctrl+F11,改变屏幕的方向。下图展示了横屏下的模拟器。注意,第一个EditText的内容仍然是存在的,但第二个EditText已经被清空了。(文章结尾会解释这是为什么)

7、观察LogCat窗口。

  1. 12-15 12:27:20.747: D/StateInfo(557):onCreate  
  2. 12-15 12:27:20.747: D/StateInfo(557):onStart  
  3. 12-15 12:27:20.747: D/StateInfo(557):onResume  
  4. ...  
  5. 12-15 12:39:37.846: D/StateInfo(557):onPause  
  6. 12-15 12:39:37.846: D/StateInfo(557):onStop  
  7. 12-15 12:39:37.866: D/StateInfo(557):onDestroy  
  8. 12-15 12:39:38.206: D/StateInfo(557):onCreate  
  9. 12-15 12:39:38.216: D/StateInfo(557):onStart  
  10. 12-15 12:39:38.257: D/StateInfo(557):onResume  
从LogCat窗口可以看出,当屏幕方向改变的时候,Activity被销毁了。
  1. 12-15 12:39:37.846: D/StateInfo(557):onPause  
  2. 12-15 12:39:37.846: D/StateInfo(557):onStop  
  3. 12-15 12:39:37.866: D/StateInfo(557):onDestroy  
随之,它又被重新创建了。
  1. 12-15 12:39:38.206: D/StateInfo(557):onCreate  
  2. 12-15 12:39:38.216: D/StateInfo(557):onStart  
  3. 12-15 12:39:38.257: D/StateInfo(557):onResume 
在屏幕旋转时,会销毁当activity,所以我们要保存我们的数据,而onpause方法是销毁时最开始执行的方法,所以我们要把保存数据写在这个方法中。


在上面例子可以看出,有id的edittext保存了数据,而没有id的edittext没有保存数据,这是系统自己执行的保存动作,那么怎样手动保存呢,下面开始说。

当activity被销毁的时候,会调用onpause方法或onSaveinstancestate方法,但是当activity葱调用栈中被清除的时候onsaveinstancestate方法不被调用,所以我们要尽量把保存数据写在onpause方法中

简而言之,想要保存activity的状态,那么总是要实现onPause()方法,然后使用你自己的方法去保存状态信息,例如使用数据库,外部或内部的存储。
如果你想简单地保存状态信息,当activity在重新创建的时候,从新加载这些信息。一个简单的方法就是实现onSaveInstanceState()这个方法,因为它提供了一个Bundle对象作为参数,这样,就可以使用这个Bundle对象去保存activity的信息。下面的代码将展示如何使用onSaveInstanceState()方法:
	@Override
	protected void onSaveInstanceState(Bundle outState) {
		// TODO Auto-generated method stub
		outState.putString("id", "12324");
		super.onSaveInstanceState(outState);
	}
当activity被重建的时候oncreate方法首先被调用,然后onrestoreinstancestate方法被调用,恢复保存数据
	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
          String	ID = savedInstanceState.getString("id");
	}

但是 onRestoreInstanceState这个方法也有局限性,它只能通过Bundle存放数据,如果想要存放更多的数据,更复杂的数据,这样就不太合适了,再介绍一种方法
当一个activity配置被修改的时候,这个方法会自动被调用,返回object类型,意味着你可以存放任何类型数据
把你想保存的东西,通过这个方法返回出来。
可以观察到,这个方法返回一个Object对象,这就允许你返回任何数据类型。如果要提取保存的数据,可以在onCreate()方法中进行提取,使用getLastNonConfigurationInstance()回调方法:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        String message = (String)getLastNonConfigurationInstance();
    }

onRetainNonConfigurationInstance()和getLastNonConfigurationInstance(),这两个方法可以允许你随时地保存信息。
例如,当用户下载数据的同时改变了屏幕方法,使用这两个方法去保存数据,总好过重新下载数据吧。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值