一、Activity的生命周期
1.1返回栈
Android 使用任务(Task)来管理活动,而一个任务就是一组存放在栈里的活动的集合,又称为返回栈。
在默认情况下,新活动会在返回栈中入栈并处于栈顶的位置,按下Back或调用finish()方法后,处于栈顶的活动会出栈,前一个活动就会处于栈顶的位置。
栈顶的活动被显示给用户。
1.2活动状态
活动有四种状态:运行状态,暂停状态,停止状态,销毁状态。
运行和暂停状态的活动用户可见,停止和销毁不可见
1.3活动的生存期
-
onCreate(),活动第一次创建时调用,进行一些初始化操作
-
onStart(),活动不可见变为可见
-
onResume(),活动位于栈顶,且准备好与用户交互
-
onPause(),准备启动或恢复另一个活动时调用,通常在此时保留一些关键数据并释放资源,此时活动可见
-
onStop(),活动完全不可见时调用
-
onDestroy(),活动即将被销毁调用,其后活动被销毁
-
onRestart(),活动由停止变为开始运行(stop变为start)
活动的三种生存期如下: -
完整生存期:从onCreate()到onDestroy().
-
可见生存期:onStart()到onsStop(),此时活动可见
-
前台生存期:onResume()到onPause(),此时活动可交互。
二、Activity的启动方式
- standard:默认启动模式,每启动一次就创建一个活动实例位于栈顶,可以重复
- singleTop:如果活动位于栈顶,就不会重复创建,否则还是会创建。
- singleTask:创建活动时先检查栈中是否有,如果有就不创建,并且已存在的活动之上的活动全部出栈。一般用于图集,一键退出。
- singleInstance:创建的活动位于单独的栈中,启动时均复用该活动,其他程序可以共享这个活动的实例。
三、Activity现场数据保存
一般情况下,调用onPause或onStop方法,activity的实例仍然会在内存中,保存的数据不会丢失,重新回到前台后,信息会得到保留。但当系统内存不足时,调用onPause()或onStop()方法activity会被系统摧毁,通常我们采用重写onSaveInstanceState()方法的方式来存储临时数据,它接收一个Bundle类型的数据,将状态数据存储到Bundle对象中,这个方法在activity被杀死前调用。
如果调用onSaveInstanceState()方法,它将在onPause()或onStop()方法前调用
若向数据库中插入记录等,保存持久化数据的操作应该放在onPause()中. onSaveInstanceState()方法只适合保存瞬态数据, 比如UI控件的状态, 成员变量的值等.
public class MainActivity extends Activity {
private String temp;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 从savedInstanceState中恢复数据, 如果没有数据需要恢复savedInstanceState为null
if (savedInstanceState != null) {
temp = savedInstanceState.getString("temp");
System.out.println("onCreate: temp = " + temp);
}
}
public void onRestoreInstanceState(Bundle saveInstanceState) {
super.onRestoreInstanceState( saveInstanceState);
String temp = saveInstanceState.getString("temp");
System.out.println("onResume: temp = " + temp);
}
// 将数据保存到outState对象中, 该对象会在重建activity时传递给onCreate方法和onRestoreInstanceState方法
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("temp", temp);
}
四、在Activity之间传递数据
4.1传数据给下一个活动
通过Intent.putExtra方法可以将简单数据类型或可序列化对象保存在Intent对象中,然后在另一个Activity中使用getInt、getString等方法获得这些数据。示例代码如下
Intent intent =new Intent(CurrentActivity.this,OtherActivity.class);
// 创建一个带“收件人地址”的 email
Bundle bundle =new Bundle();// 创建 email 内容
bundle.putBoolean("boolean_key", true);// 编写内容
bundle.putString("string_key", "string_value");
intent.putExtra("key", bundle);// 封装 email
startActivity(intent);// 启动新的 Activity
下面是获取数据:
Intent intent =getIntent();// 收取 email
Bundle bundle =intent.getBundleExtra("key");// 打开 email
bundle.getBoolean("boolean_key");// 读取内容
bundle.getString("string_key");
如果数据比较简单的键值对,可以直接传递:
Intent intent =new Intent(EX06.this,OtherActivity.class);
intent.putExtra("boolean_key", true);
intent.putExtra("string_key", "string_value");
startActivity(intent);
获取:
Intent intent=getIntent();
intent.getBooleanExtra("boolean_key",false);
intent.getStringExtra("string_key");
4.2向上一个活动返回数据
一般来说,返回上个活动按下Back键就可以了,并没有一个用于启动的Intent来传递数据,当然,Activity中有一个 startActivityForResult()来实现这一目的
startActivityForResult()接收两个参数,intent和请求码,通过此方法来启动需要返回结果的activity,实例如下:
从Activity1跳转到Activity2:
Intent intent = new Intent();
intent = intent.setClass(ActivityIntent.this, AnotherActivity.class);
Bundle bundle = new Bundle();
bundle.putString("string", et_string.getText().toString());
intent.putExtras(bundle);
startActivityForResult(intent,0); //只有这里不同
从Activity2返回数据到Aactivity1:
Intent intent = new Intent();
intent = intent.setClass(AnotherActivity.this, ActivityIntent.class);
Bundle bundle = new Bundle();
bundle.putInt("result", "Activity2的处理结果");
intent.putExtras(bundle);
AnotherActivity.this.setResult(RESULT_OK, intent); //RESULT_OK是返回状态码
AnotherActivity.this.finish();
在Activity1中重写onActivityResault方法,接受数据,在Activity2销毁后会回调此方法(前提是用startActivityForResult()启动):
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//requestCode是传入的请求码,
//因为可能通过startActivityForResult()启动多个活动,每个活动的数据都回调到onActivityResault,因此通过requestCode获取到数据来源,再通过resultCode判断数据是否处理成功,最后通过data获取数据。
//resultCode是返回状态码,一般是RESULT_OK和RESULT_CANCELED,
//通过data获取到返回的数据
switch(resultCode) { //根据状态码,处理返回结果
case RESULT_OK:
Bundle bundle =data.getExtras(); //获取intent里面的bundle对象
String result = bundle.getInt("result");
break;
default:
break;
}
}