Activity生命周期,切换,参数传递,bundle(包),值对象,Activity参数返回,Activity的启动模式

Activity代表手机屏幕的一屏,或是平板电脑中的一个窗口。它是android应用中最重要的组成单元之一,提供了和用户交互的可视化界面。在一个Activity中,可以添加很多组件,这些组件负责具体的功能。

       在android应用中,可以有多个Activity,这些Activity组成了Activity Stack,当前活动的Activity处于栈顶,之前的Activity被压在下面,成为非活动Activity,等待是否可能被恢复为活动状态。在Activity的生命周期中,有如下表所示的四个重要状态:

状态

描述

活动状态

当前的Activity,位于栈顶,用户可见,并且可以获得焦点

暂停状态

失去焦点的Activity,仍然可见,但是在内存低的情况下,不能被系统杀死

停止状态

该Activity被其他Activity所覆盖,不可见,但是它仍然保持所有的状态和信息。但内存低的情况下,它将要被系统杀死。

销毁状态

该Activity结束,或Activity所在的Dalvik进程结束

 

对于这是个具体的状态Activity也拥有相应的函数去实现,系统会根据这些函数,在不同的生命周期返回调用对应的方法,完成Activity的状态切换。

 

这些回调函数分别是:

onCreate():创建Activity时被回调。该方法是最常见的方法,一般在IDE工具中,创建Activity的话,会默认创建一个onCreate()方法,同时默认重写onCreate(Bundle saveInstanceState)方法,使得Activity能够被初始化。

onStart():启动Activity时回调,也就是但一个Activity变为显示时被回调。

onRestart():重新启动Activity时被回调,该方法总是在onStart()之后执行。

onPause():暂停Activity时被回调。该方法需要被非常快速的执行,因为直到该方法执行完毕后,下一个Activity才能恢复。在该方法中,通常用于持久保存数据。

onresume():但Activity由暂停状态恢复为活动状态时调用。调用该方法后,该Activity位于Activity的栈顶。该方法总是在onPause()方法以后执行。

onStop():停止Activity时被调用。

onDestory():销毁Activity时被调用。

Activity的完整周期运行模式,如下图所示:

 

在Activity之间切换的方法:

Current Activity 代码:

Intent i = new Intent(CurrentActivity.this,destinationActivity.class)
startActivity(i);

 

Activity之间参数传递:

Intent 对象也可以储存数据,在Acivity之间切换时,完成数据传递

Current Activity 代码:

Intent i = new Intent();

i.putExtra("data","fog meassage!");//i.putExtra(String dataName,String data);

Destination Activity 代码:

Inten i = getIntent();
TextView.setText(i.getString("data")); //TextView.setText("dataName");

 

Activity之间的Bundle(包)传递:

Current Activity 代码:

Intent i = new Intent();
Bundle data = new Bundle(); data.putString("name","fog"); data.putInt("age",25); i.putExtras(data); //putExtra()用于单值传递,putExtras()用于bundle的传递

Destination Activity 代码:

Inten i = getIntent();
Bundle data = i.getExtras();
txShow.setText(String.format("name=%s,age=%d,name1=%s",data.getString("name"),data.getInt("age"),
data.getString("name1","null.fog")));
//name1 没有得到相应的值则默认为“null.fog”

 //String.format()为字符串的格式化输出

 

Activity之间传递自定义class的对象方法(值对象/有数据结构的对象):

如果传递的是自定义的class对象信息,那么有两个方法可以实现,否则会出现nullpointException或Cating Exception。

方法一:实现Serializable接口(该接口属于java)

方法二:实现Parcelable接口(该接口属于Android)

//方法一:
class User implements Serializable {
       属性和方法  
}

//方法二:
class User implements Parcelable {
       属性和方法 
  
@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(getName());
dest.writeInt(getAge());
}
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel source) {
return new User(source.readString(),source.readInt());
}

@Override
public User[] newArray(int size) {
return new User[size];
}
};
}
 

两种方法的比较:

方法一只需要声明一下implements Serializable即可,十分方便和简单,而方法二需要重写大量方法和数据处理过程,十分繁琐,且不易理解和使用。但方法一来自java类库,里面的数据处理完全依赖系统自己处理,从而导致效率底下,方法二来自Android的类库,而且由程序员自己设定的方法执行,对于系统的负担较小且效率相对而言更高。

Activity的参数返回:

Current Activity 代码:

i.putExtra("user",new User("fog",2));
// startActivity(i);
// 这里不能再使用startActivity()方法
 startActivityForResult(i,0);  
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

TextView.setText("另一个Activity返回的数据是" + data.getStringExtra("data"));

}

Destination Activity 代码:

Intent i = new Intent();
i.putExtra("data",editText.getText().toString());  //这里是通过一个EditText控件获取的输入信息
setResult(1,i);                     //
finish();                         //此方法为结束当前Activity,方便参数在源Activity中显示

 Activity的启动模式:

Activity拥有四种启动模式:

1.标准模式(standard)

2.singleTop

3.singleTask

4.SingleInstance

 

Activity堆栈的存在:

启动Acitivity时,从第一个实例化对象开始,再打开一个Acitivity对象就将原先的Activity压入栈内,新建的Acitivity处于栈顶,以此类推。所谓的Activity模式就是Acitivity的栈的运作方式。

 

标准启动模式(此模式为默认启动模式):

在一个Acitivity堆栈内,每打开一个新的Acitivity就新建一个Acitivity的实例化对象,并将其压入栈顶,每当执行一次后退操作,即杀死栈顶的Acitivity,将上一个Acitivity还原并使其处于栈顶。

注:此模式下,所有的Acitivity均处于同一个Acitivity任务栈中,并且若打开已经打开过的Acitivity对象,会创建新的实例化对象。

 

singleTop模式:

若一个Acitivity位于栈顶,则不能再次创建此Acitivity的实例化对象,若不位于栈顶,则会创建新的实例化对象。相比标准模式而言,就是禁止位于栈顶的Acitivity对象重复打开自己。

注:此模式下的Acitivity同样处于一个任务栈中

 

SingleTask模式:

若A,B按顺序启动后,Acitivity的栈的顺序为AB(从栈底到栈顶),此时位于Acitivity B,若想回到Acitivity A,则系统会回到最初创建的 A Acitivity的位置,并抛弃或杀死掉自最初A Acitivity创建至现在所有的Acitivity实例化对象,若AB顺序回到A,则B会被杀死。

注:此模式下的Acitivity同样处于一个任务栈中

 

和SingleInstance模式:

此模式下,一个任务栈只能存在一个Acitivity实例化对象,若开启其他Acitivity会在另一个任务栈中打开。

注:除此模式下,所有的Acitivity均处于不同的任务栈以外,其他的模式中Acitivity所有的实例化对象均处于同一个任务栈中。

 

posted @ 2016-06-29 19:54  thinfog  阅读(398)  评论(0编辑  收藏  举报