Activity是android四大组件中使用频率最为频繁的组件,相当于负责与用户交互的窗口。我们调用setContentView(R.layout.xxxviewId)来指定当前actvity的界面。
Activity的生命周期
学习新的知识是可以类比的,以前在学习servlet的时候,就知道servlet有lifecycle,都有一系列创建实例,初始化,销毁的过程。同样,activity也是具有自己的lifecycle,android官网关于生命周期有一张经典的图:
/**
* activity创建的时候调用
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* activity可见的时候调用
*/
@Override
protected void onStart() {
super.onStart();
Log.i(TAG, "onStart called.");
}
//Activity从后台重新回到前台时被调用
@Override
protected void onRestart() {
super.onRestart();
Log.i(TAG, "onRestart called.");
}
/**
Activity创建或者从被覆盖、后台重新回到前台时被调用
获取焦点的时候调用
*
*/
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume called.");
}
//Activity窗口获得或失去焦点时被调用,在onResume之后或onPause之后
/*@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
Log.i(TAG, "onWindowFocusChanged called.");
}*/
//Activity被覆盖到下面或者锁屏时被调用,失去焦点时候调用
@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "onPause called.");
//有可能在执行完onPause或onStop后,系统资源紧张将Activity杀死,所以有必要在此保存持久数据
}
//退出当前Activity或者跳转到新Activity时被调用
@Override
protected void onStop() {
super.onStop();
Log.i(TAG, "onStop called.");
}
//退出当前Activity时被调用,调用之后Activity就结束了
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestory called.");
}
/**
* Activity被系统杀死时被调用.
* 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死.
* 另外,当跳转到其他Activity或者按Home键回到主屏时该方法也会被调用,系统是为了保存当前View组件的状态.
* 在onPause之前被调用(3.0之前).3.0之后在onPause()之后调用
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putInt("param", param);
Log.i(TAG, "onSaveInstanceState called. put param: " + param);
super.onSaveInstanceState(outState);
}
/**
* Activity被系统杀死后再重建时被调用.
* 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死,用户又启动该Activity.
* 这两种情况下onRestoreInstanceState都会被调用,在onStart之后.
*/
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
param = savedInstanceState.getInt("param");
Log.i(TAG, "onRestoreInstanceState called. get param: " + param);
super.onRestoreInstanceState(savedInstanceState);
}
```
###Activity之间传递数据
####通过Intent传递数据
通过Intent.putExtra方法可以将简单数据类型或可序列化对象(对象必须实现Serializable或者Parcelable接口)保存在Intent对象中,然后在另一个Activity中使用getInt、getString等方法获得这些数据。代码示例如下:
``` java
Intent intent = new Intent(MainActivity.this, TargetActivity.class);
intent.putExtra("boolean", true);
intent.putExtra("string", "string");
startActivity(intent);
<div class="se-preview-section-delimiter"></div>
下面是获取数据:
Intent intent=getIntent();
intent.getBooleanExtra("boolean");
intent.getStringExtra("string");
<div class="se-preview-section-delimiter"></div>
通过Intent和bundle传递数据
Intent intent = new Intent(MainActivity.this, TargetActivity.class);
Bundle bundle =new Bundle();
bundle.putExtra("boolean", true);
bundle.putExtra("string", "string");
intent.putExtras(bundle);
startActivity(intent);
<div class="se-preview-section-delimiter"></div>
下面是获取数据:
Intent intent=getIntent();
Bundle bundle = intent.getExtras();
bundle.getBooleanExtra("boolean");
bundle.getStringExtra("string");
<div class="se-preview-section-delimiter"></div>
从Activity返回数据
启动新的Activity
Intent intent = new Intent(MainActivity.this, TargetActivity.class);
startActivityForResult(intent,1); //注意调用的方法,1是约定的响应值(requestCode)
<div class="se-preview-section-delimiter"></div>
在新的Activity中处理
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("result", "返回的数据");
intent.putExtras(bundle);
setResult(RESULT_OK, intent); //RESULT_OK是返回状态码 this.finish();
<div class="se-preview-section-delimiter"></div>
在Activity1的中的处理,重写onActivityResault方法,接受数据
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode==1&&resultCode==RESULT_OK){
Bundle bundle =data.getExtras();
String result = bundle.getInt("result");
}
}
<div class="se-preview-section-delimiter"></div>
Activity的状态保存
在Activity生命周期的代码中我已经使用到这两个方法:
/**
* Activity被系统杀死时被调用.
* 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死.
* 另外,当跳转到其他Activity或者按Home键回到主屏时该方法也会被调用,系统是为了保存当前View组件的状态.
* 在onPause之前被调用(3.0之前).3.0之后在onPause()之后调用
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putInt("param", param);
Log.i(TAG, "onSaveInstanceState called. put param: " + param);
super.onSaveInstanceState(outState);
}
/**
* Activity被系统杀死后再重建时被调用.
* 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死,用户又启动该Activity.
* 这两种情况下onRestoreInstanceState都会被调用,在onStart之后.
*/
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
param = savedInstanceState.getInt("param");
Log.i(TAG, "onRestoreInstanceState called. get param: " + param);
super.onRestoreInstanceState(savedInstanceState);
}
但是在onSaveInstanceState中只适合保存瞬态数据,持久化数据应该在onPause中保存.
“`
从Activity返回数据
启动新的Activity
“` java
Intent intent = new Intent(MainActivity.this, TargetActivity.class);
startActivityForResult(intent,1); //注意调用的方法,1是约定的响应值(requestCode)
“`
在新的Activity中处理
“` java
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString(“result”, “返回的数据”);
intent.putExtras(bundle);
setResult(RESULT_OK, intent); //RESULT_OK是返回状态码 this.finish();
“`
在Activity1的中的处理,重写onActivityResault方法,接受数据
“`java
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode==1&&resultCode==RESULT_OK){
Bundle bundle =data.getExtras();
String result = bundle.getInt(“result”);
}
}
###Activity的状态保存
在Activity生命周期的代码中我已经使用到这两个方法:
```java
/**
* Activity被系统杀死时被调用.
* 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死.
* 另外,当跳转到其他Activity或者按Home键回到主屏时该方法也会被调用,系统是为了保存当前View组件的状态.
* 在onPause之前被调用(3.0之前).3.0之后在onPause()之后调用
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putInt("param", param);
Log.i(TAG, "onSaveInstanceState called. put param: " + param);
super.onSaveInstanceState(outState);
}
/**
* Activity被系统杀死后再重建时被调用.
* 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死,用户又启动该Activity.
* 这两种情况下onRestoreInstanceState都会被调用,在onStart之后.
*/
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
param = savedInstanceState.getInt("param");
Log.i(TAG, "onRestoreInstanceState called. get param: " + param);
super.onRestoreInstanceState(savedInstanceState);
}
但是在onSaveInstanceState中只适合保存瞬态数据,持久化数据应该在onPause中保存.
《Android群英传》第八章节
《安卓第一行代码》
本文永久链接http://itxuye.com/android-activity.html,转载请注明出处,欢迎交流讨论。