曾经,我这么理解Activity:每个Activity对应一个界面。
其实这样的理解应该算有点沾边了,实际上每个Activity一般对应一个单独的页面,但是Activity并不是用来新建界面的,Activity作为android组件中最基本也是最常见的四大组件之一,是负责与用户交互的,可以把控件放到上面也可以监听并处理用户事件并作出响应。
Activity为android应用提供了可视化用户界面,开发者可以通过setContentView()方法设置显示内容:
setContentView(R.layout.main);
如上面的那一行代码,调用的是布局文件中名为main的文件,如果预先在main.xml中设置好控件并布局好位置,那么调用之后就可以在窗口显示了。
Activity的生命周期:
在网上看到了典型的Activity生命周期的流程图如下图:
图片已经很清楚的告诉我们Activity的生命周期从onCreate开始到onStop结束。
简单的说Activity可以分成四个状态:
1.运行状态:就是图片上Activity is running以上的那部分;
2.暂停状态:onPause(),暂停状态是指Acitivty处于暂停状态,并且在屏幕上还是可见的;
3.停止状态:onStop(),停止状态其实跟暂停状态差不多,区别在于屏幕上不可见;
4.结束状态(此状态不属于生命周期内):处于暂停状态或者停止状态的Activity,终止其进程。
为了更好的了解Activity的生命周期,请看下面的代码:
public class ActivityDemoActivity extends Activity {
/** Called when the activity is first created. */
@Override
/**
* 第一个方法是activity的生命周期的开始,onCreate,这是activity的创建
* 原有的activity进程意外中断后也是调用此方法重新创建
*/
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
/**
* 创建Activity之后要让它开始工作,onStart是让activity开始工作的方法,
*/
protected void onStart() {
}
@Override
/**
* * 当activity处于onStop的时候,要想恢复activity进程也是调用此方法,因为处于onStop的activity的进程并没有结束,只是停止了而已并不需要重新创建
* 但是处于onRestart状态的activity只是处于堆栈的顶部,处于可运行状态,还需要调用onStart
*/
protected void onRestart() {
}
@Override
/**
* 此方法是让处于onPause状态的activity恢复到运行状态
*/
protected void onResume() {
}
@Override
/**
* 当acticity被弹出的对话框或者透明的界面挡住的时候,activity将处于此状态(也就是说当activity失去焦点但是还是可见的时候处于此状态)
* 并且此状态activity运行时所有的数据还保存着,调用onResume之后可以恢复到原来的状态
*/
protected void onPause() {
}
@Override
/**
* 当一个activity处于不可见状态的时候,用户不再与它交互,此时它就处于此状态。
*/
protected void onStop() {
}
@Override
/**
* 此状态不属于activity的生命周期,但是每个activity都必经这个状态
* 当activity处于onStop状态时,并且不再被调用时,就会被销毁,此时就需要这个方法了
*/
protected void onDestroy() {
}
}
上面的代码只是自己理解并没有经常证明,后面学习了下Log标签,这是个好东西啊,相当于java的system.out.print,然后在上面的代码上加上了Log标签,打印了处于各个状态的情况:
package my.demo.activity;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class ActivityDemoActivity extends Activity {
/** Called when the activity is first created. */
@Override
/**
* 第一个方法是activity的生命周期的开始,onCreate,这是activity的创建
* 原有的activity进程意外中断后也是调用此方法重新创建
*/
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
/**
* 创建Activity之后要让它开始工作,onStart是让activity开始工作的方法,
*/
protected void onStart() {
super.onStart();
Log.d("tag","-----onStart");
}
@Override
/**
* * 当activity处于onStop的时候,要想恢复activity进程也是调用此方法,因为处于onStop的activity的进程并没有结束,只是停止了而已并不需要重新创建
* 但是处于onRestart状态的activity只是处于堆栈的顶部,处于可运行状态,还需要调用onStart
*/
protected void onRestart() {
super.onRestart();
Log.d("tag","-----onRestart");
}
@Override
/**
* 此方法是让处于onPause状态的activity恢复到运行状态
*/
protected void onResume() {
super.onResume();
Log.d("tag","-----onResume");
}
@Override
/**
* 当acticity被弹出的对话框或者透明的界面挡住的时候,activity将处于此状态(也就是说当activity失去焦点但是还是可见的时候处于此状态)
* 并且此状态activity运行时所有的数据还保存着,调用onResume之后可以恢复到原来的状态
*/
protected void onPause() {
super.onPause();
Log.d("tag","-----onPause");
}
@Override
/**
* 当一个activity处于不可见状态的时候,用户不再与它交互,此时它就处于此状态。
*/
protected void onStop() {
super.onStop();
Log.d("tag","-----onStop");
}
@Override
/**
* 此状态不属于activity的生命周期,但是每个activity都必经这个状态
* 当activity处于onStop状态时,并且不再被调用时,就会被销毁,此时就需要这个方法了
*/
protected void onDestroy() {
super.onDestroy();
Log.d("tag","-----onDestroy");
}
}
经过验证,我发现,当手机暗屏是activity也是处于onPause状态的;另外,我之前不知道的一个情况:当手机横屏的时候,会结束掉原来的Activity并新建一个。
于是我在想,如果Activity正在于用户交互突然横屏了,数据会不会丢失呢?
于是我加上了一个文本编辑器,在上面写文字。
实际上横屏的时候Activity是销毁并重新建了一个,但是数据并没有丢失。