标签归档:基础概念

onSaveInstanceState和onRestoreInstanceState触发的时机

当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState就会被执行,除非该activity是被用户主动销毁的,例如当用户按BACK键的时候。

注意上面的双引号,何为“容易”?言下之意就是该activity还没有被销毁,而仅仅是一种可能性。这种可能性有哪些?通过重写一个activity的所有生命周期的onXXX方法,包括onSaveInstanceState和onRestoreInstanceState方法,我们可以清楚地知道当某个activity(假定为activity A)显示在当前task的最上层时,其onSaveInstanceState方法会在什么时候被执行,有这么几种情况:

1、当用户按下HOME键时。

这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则

2、长按HOME键,选择运行其他的程序时。

3、按下电源按键(关闭屏幕显示)时。

4、从activity A中启动一个新的activity时。

5、屏幕方向切换时,例如从竖屏切换到横屏时。

在屏幕切换之前,系统会销毁activity A,在屏幕切换之后系统又会自动地创建activity A,所以onSaveInstanceState一定会被执行。

总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。

至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成对的被调用的,onRestoreInstanceState被调用的前提是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState方法不会被执行。

另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原。

http://justsee.iteye.com/blog/1113104

http://www.cnblogs.com/hanyonglu/archive/2012/03/28/2420515.html

Android中Activity和Intent之间的联系

A场景简单地跳转到B场景

无参数Activity跳转

Intent it = new Intent(Activity.Main.this, Activity2.class);
startActivity(it);   

A场景跳转到B场景,有数据关联。

譬如从列表页到详情页,需要携带数据到下一个场景。向下一个Activity传递数据(使用Bundle和Intent.putExtras)。

Intent it = new Intent(Activity.Main.this, Activity2.class);
Bundle bundle=new Bundle();
bundle.putString("name", "This is from MainActivity!");
it.putExtras(bundle);       // it.putExtra(“test”, "shuju”);
startActivity(it);            // startActivityForResult(it,REQUEST_CODE);

对于数据的获取可以采用:

Bundle bundle=getIntent().getExtras();
String name=bundle.getString("name");

A场景要求B场景做些事,并汇报结果。譬如从相册读取一张照片。

  1. A要求B做事
startActivityForResult(it,REQUEST_CODE);
  1. B做完事汇报结果
    向上一个Activity返回结果(使用setResult,针对startActivityForResult(it,REQUEST_CODE)启动的Activity)
Intent intent=getIntent();
Bundle bundle2=new Bundle();
bundle2.putString("name", "This is from ShowMsg!");
intent.putExtras(bundle2);
setResult(RESULT_OK, intent);

3.A根据结果做进一步处理。
回调上一个Activity的结果处理函数(onActivityResult)

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode==REQUEST_CODE){
            if(resultCode==RESULT_CANCELED)
                  setTitle("cancle");
            else if (resultCode==RESULT_OK) {
                 String temp=null;
                 Bundle bundle=data.getExtras();
                 if(bundle!=null)   temp=bundle.getString("name");
                 setTitle(temp);
            }
        }
    }

结论

Activity就一个场景。
intent提供不同场景之间的数据传递。

Android中visibility属性VISIBLE、INVISIBLE、GONE的区别

Android开发中,大部分控件都有visibility这个属性,其属性有3个分别为“visible ”、“invisible”、“gone”。主要用来设置控制控件的显示和隐藏。有些人可能会疑惑Invisible和gone是有什么区别的???那么,我们带着这个疑问看下面:

其在XML文件和Java代码中设置如下:

可见(visible)

XML文件:android:visibility=”visible”

Java代码:view.setVisibility(View.VISIBLE);

 

不可见(invisible)

XML文件:android:visibility=”invisible”

Java代码:view.setVisibility(View.INVISIBLE);

 

隐藏(GONE)

XML文件:android:visibility=”gone”

Java代码:view.setVisibility(View.GONE);

 

 

为了区别三者,我建了一个Dome进行演示,先上Dome的代码,演示后就知道它们的区别:

XML文件:

  1. <?xml version=“1.0” encoding=“utf-8”?>
  2. <LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
  3.     android:layout_width=“fill_parent”
  4.     android:layout_height=“fill_parent”
  5.     android:orientation=“vertical”>
  6.     <LinearLayout
  7.         android:layout_width=“fill_parent”
  8.         android:layout_height=“wrap_content”
  9.         android:orientation=“horizontal”
  10.         android:layout_marginBottom=“20dip” >
  11.         <TextView
  12.             android:layout_width=“wrap_content”
  13.             android:layout_height=“wrap_content”
  14.             android:layout_weight=“1”
  15.             android:background=“#F00”
  16.             android:text=“TextView1”
  17.             android:textSize=“23sp”
  18.             android:visibility=“visible” />
  19.         <TextView
  20.             android:id=“@+id/mainTV2”
  21.             android:layout_width=“wrap_content”
  22.             android:layout_height=“wrap_content”
  23.             android:layout_weight=“1”
  24.             android:background=“#00F”
  25.             android:text=“TextView2”
  26.             android:textSize=“23sp”
  27.             android:visibility=“visible” />
  28.     </LinearLayout>
  29.     <Button
  30.         android:id=“@+id/mainBtn1”
  31.         android:layout_width=“fill_parent”
  32.         android:layout_height=“wrap_content”
  33.         android:text=“TextView2为VISIBLE”
  34.         android:onClick=“mianOnClickListener”/>
  35.     <Button
  36.         android:id=“@+id/mainBtn2”
  37.         android:layout_width=“fill_parent”
  38.         android:layout_height=“wrap_content”
  39.         android:text=“TextView2为INVISIBLE”
  40.         android:onClick=“mianOnClickListener”/>
  41.     <Button
  42.         android:id=“@+id/mainBtn3”
  43.         android:layout_width=“fill_parent”
  44.         android:layout_height=“wrap_content”
  45.         android:text=“TextView2为GONE”
  46.         android:onClick=“mianOnClickListener”/>
  47. </LinearLayout>

后面三个Button只要是控制TextView的visibility的属性

Java代码:

  1. package com.chindroid.visibility;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.widget.TextView;
  6. public class MainActivity extends Activity {
  7.     /** TextView2 */
  8.     private TextView mainTV2 = null;
  9.     @Override
  10.     public void onCreate(Bundle savedInstanceState) {
  11.         super.onCreate(savedInstanceState);
  12.         setContentView(R.layout.main);
  13.         //初始化数据
  14.         initData();
  15.     }
  16.     /** 初始化控件的方法 */
  17.     private void initData() {
  18.         mainTV2 = (TextView)findViewById(R.id.mainTV2);
  19.     }
  20.     /**
  21.      * MainActivity中响应按钮点击事件的方法
  22.      * 
  23.      * @param v
  24.      */
  25.     public void mianOnClickListener(View v){
  26.         switch (v.getId()){
  27.             case R.id.mainBtn1:{    //按钮1的响应事件
  28.                 //设置TextView2可见
  29.                 mainTV2.setVisibility(View.VISIBLE);
  30.                 break;
  31.             }
  32.             case R.id.mainBtn2:{    //按钮2的响应事件
  33.                 //设置TextView2不可见
  34.                 mainTV2.setVisibility(View.INVISIBLE);
  35.                 break;
  36.             }
  37.             case R.id.mainBtn3:{    //按钮3的响应事件
  38.                 //设置TextView2隐藏
  39.                 mainTV2.setVisibility(View.GONE);
  40.                 break;
  41.             }
  42.             default:
  43.                 break;
  44.         }
  45.     }
  46. }

由于程序一启动两个TextView都是可见的

当我们点击第1个按钮,把TextView2 visibility属性设置为INVISIBLE时,程序如下如下图所示:

当我们点击第3个按钮,把TextView2 visibility属性设置为GONE时,程序如下如下图所示:

当我们再点击第1个按钮,把TextView2 visibility属性设置为VISIBLE时,TextView2又呈现出来了,如下图所示:

 

由上面的演示可知

VISIBLE:设置控件可见

INVISIBLE:设置控件不可见

GONE:设置控件隐藏

 

而INVISIBLE和GONE的主要区别是:当控件visibility属性为INVISIBLE时,界面保留了view控件所占有的空间;而控件属性为GONE时,界面则不保留view控件所占有的空间。