Activity是Android四大组件之一,简单总结一下Activity组件。
一.Activity含义
Activity 是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。 每个 Activity 都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上。
二.Activity的状态
状态 | 状态说明 |
---|---|
Active/Running(运行中) | 此 Activity 位于屏幕前台并具有用户焦点。 |
Paused(暂停) | 另一个 Activity 位于屏幕前台并具有用户焦点,但此 Activity 仍可见。(另一个 Activity 显示在此 Activity 上方,并且该 Activity 部分透明或未覆盖整个屏幕。) |
Stopped(停止) | 该 Activity 被另一个 Activity 完全遮盖,它对用户不再可见。 |
Killed(终止) | 当Activity被系统回收掉。 |
三.Activity的创建和启动
1.Activity的创建
在manifest中注册Activity:
必须在清单文件中声明,系统才能访问这个Activity。
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
其中在”intent-filter”中加上
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
表明此Activitiy是主Activity,程序启动先显示此界面。
创建Activity:
必须创建 Activity 的子类(或使用其现有子类),需要在子类中实现 Activity 在其生命周期的各种状态之间转变时系统调用的回调方法。
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG, "onCreate: ");
}
......
}
2.启动Activity
Activity通过Intent来实现在应用程序的Activity间启动、停止和传输。
以在MainActivity上启动SecondActivity为例:
(1).显示启动:
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
(2)隐式启动:
在清单文件中设置intent-filter的action和category、data等:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="action_to_secondActivity"/>
<category android:name="android.intent.category.DEFAULT"/>/>
</intent-filter>
</activity>
跳转时调用:
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
四.Activity生命周期
方法 | 说明 |
---|---|
onCreate() | 首次创建 Activity 时调用,是生命周期的第一个方法,在生命周期中只执行一次,用于调用setContentView去加载界面布局等初始化操作,始终后接onStart()。 |
onRestart() | 在 Activity 已停止并即将再次启动前调用。始终后接onStart()。 |
onStart() | 在 Activity 即将对用户可见之前调用。如果 Activity 转入前台,则后接 onResume(),如果 Activity 转入隐藏状态,则后接 onStop()。 |
onResume() | 在 Activity 即将开始与用户进行交互之前调用。 此时,Activity 处于 Activity 堆栈的顶层,并具有用户输入焦点。始终后接 onPause()。 |
onPause() | 当系统即将开始继续另一个 Activity 时调用。 此方法通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗 CPU 的内容,诸如此类。 它应该非常迅速地执行所需操作,因为它返回后,下一个 Activity 才能继续执行。如果 Activity 返回前台,则后接 onResume(),如果 Activity 转入对用户不可见状态,则后接 onStop()。 |
onStop() | 在 Activity 对用户不再可见时调用。如果 Activity 被销毁,或另一个 Activity(一个现有 Activity 或新 Activity)继续执行并将其覆盖,就可能发生这种情况。如果 Activity 恢复与用户的交互,则后接 onRestart(),如果 Activity 被销毁,则后接 onDestroy()。 |
onDestroy() | 在 Activity 被销毁前调用。这是 Activity 将收到的最后调用。 当 Activity 结束(有人对 Activity 调用了 finish()),或系统为节省空间而暂时销毁该 Activity 实例时,可能会调用它。 您可以通过 isFinishing() 方法区分这两种情形。 |
特别说明:
onPause()、onStop() 和 onDestroy()三种方法返回后可以终止进程。如果系统在紧急情况下必须恢复内存,可能不会调用 onStop() 和 onDestroy()。所以onPause()成为结束进程前最后调用的方法。
因此使用 onPause() 向存储设备写入至关重要的持久性数据。
五.几种情况下生命周期方法调用
1.启动Activity:
onCreate()->onStart()->onResume();
2.按back键返回到主屏:
onPause()->onStop()->onDestroy();
3.当前Activity创建完成后,按Home键回到主屏:
onPause()->onStop();
4.点击Home键回到主界面后:
onRestart()->onStart()->onResume();
5.从当前Activity跳转到新的Activity:
原Activity的onPause()->新Activity的onCreate()->新Activity的onStart()->新Activity的onResume()->原Activity的onStop();
此时如果新Activity设置为透明主题(
android:theme=”@android:style/Theme.Translucent” )则日志为:
最后原Activity的onStop()不会执行。
6.在新Activity页面点击Back键返回到原来Activity时:
新Activity的onPause()->原Activity的onRestart()->原Activity的onStart()->原Activity的onResume()->新Activity的onStop()->新Activity的onDestroy();
当新Activity设置为透明主题,日志为:
由于5时不执行onStop(),故此时不会执行onRestart()和onStart()。
六.Activity的onSaveInstanceState和onRestoreInstanceState方法
onSaveInstanceState和onRestoreInstanceState方法不是生命周期中的方法,不一定被触发。
onSaveInstanceState方法:当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity时,onSaveInstanceState() 会被调用。一般在onStop方法之前。
onRestoreInstanceState方法:只有在Activity真的被系统非正常杀死过,恢复显示Activity的时候,会调用onRestoreInstanceState。一般在onResume方法之前。
说明:通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。