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所有的实例化对象均处于同一个任务栈中。