活动(Activity)是最容易吸引用户的地方,它是一种可以包含用户界面的组件,主要用于和用户进行交互。一个应用程序中可以包含零个或多个活动,但不包含任何活动的应用程序很少见,谁也不想让自己的应用永远无法被用户看到吧?————摘自《第一行代码》

onCreate、onStart、onResume。onPause、onStop。onRestart、onStart、onResume。onPause、onStop、onDestroy。| 回调 | 描述 |
|---|---|
| onCreate() | 这是第一个回调,在活动第一次创建时调用 |
| onRestart() | 在当前活动重新显示给用户(用户已导航回该活动)之后调用。 |
| onStart() | 这个回调在活动为用户可见时被调用 |
| onResume() | 这个回调在应用程序与用户开始可交互的时候调用 |
| onPause() | 被暂停的活动无法接受用户输入,不能执行任何代码。当前活动将要被暂停,上一个活动将要被恢复时调用 |
| onStop() | 当活动不在可见时调用 |
| onDestroy() | 当活动被系统销毁之前调用 |
通过这个代码示例,形象化步骤用以展示 Android 应用程序活动的生命周期。还是用HelloWorld这个敲门砖进行加工展示。
下面是主要活动文件 java/com/example/myapplication/MainActivity.java修改的内容。里面包含每一个基本的生命周期方法。Log.d()方法用来生成日志信息:
package com.example.myapplication;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
String msg = "Android : ";
/** 当活动第一次被创建时调用 */
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(msg, "The onCreate() event");
}
/** 当活动重新显示时调用 */
@Override
protected void onRestart() {
super.onRestart();
Log.d(msg, "The onRestart() event");
}
/** 当活动即将可见时调用 */
@Override
protected void onStart() {
super.onStart();
Log.d(msg, "The onStart() event");
}
/** 当活动可见时调用 */
@Override
protected void onResume() {
super.onResume();
Log.d(msg, "The onResume() event");
}
/** 当其他活动获得焦点时调用 */
@Override
protected void onPause() {
super.onPause();
Log.d(msg, "The onPause() event");
}
/** 当活动不再可见时调用 */
@Override
protected void onStop() {
super.onStop();
Log.d(msg, "The onStop() event");
}
/** 当活动将被销毁时调用 */
@Override
public void onDestroy() {
super.onDestroy();
Log.d(msg, "The onDestroy() event");
}
}
点击启动后,可以在Logcat中看到日志信息,如果太多可以筛选;

点击 Home 键,将在 Logcat 窗口产生如下的事件消息;

点击菜单键,选选择 Activity 的页面,重新进入,将在 Logcat 窗口产生如下的事件消息;

点击返回键,退出到主界面,将在 Logcat 窗口产生如下的事件消息;

默认情况下,在横竖屏切换的过程中,会发生 Activity 被销毁并重建的过程。 在了解这种情况下的生命周期时,首先应该了解这两个回调:onSaveInstanceState 和 onRestoreInstanceState。
onSaveInstanceState 来保存当前 ActivityonRestoreInstanceState,并且把 Activity 销毁时onSaveInstanceState 方法所保存的 Bundle 对象参数同时传递给 onRestoreInstanceState 和onCreate 方法。 因此,可以通过 onRestoreInstanceState 方法来恢复 Activity 的状态,该方法的调用时机是在 onStart 之后。其中 onCreate 和 onRestoreInstanceState 方法来恢复 Activity 的状态的区别: onRestoreInstanceState 回调则表明其中 Bundle 对象非空,不用加非空判断。onCreate 需要非空判断。建议使用 onRestoreInstanceState。
如果 Activity 重建 onRestoreInstanceState 方法必定会被调用,onRestoreInstanceState 调用时机在 Activity 的 onStart 方法之后。调用链就在 ActivityThread 的 performLaunchActivity() 中的 mInstrumentation.callActivityOnRestoreInstanceState。
横竖屏切换的生命周期:onPause()-> onStop()->onSaveInstanceState()->onDestroy()->onCreate()->onStart()->onRestoreInstanceState->onResume()
在清单文件中设置 configChanges 的属性为 orientation | screenSize。这时旋转屏幕后,Activity 并不会重建,取而代之的是调用 onConfigurationChanged() 方法。
onNewIntent() 方法。如果不在栈顶,那么依然会被创建并添加到栈顶。在通知栏点击收到的通知,然后需要启动一个 Activity,这个 Activity 就可以用 singleTop,但 singleTop 启动模式并不是每次都有效。需要注意一点的是,启动 Activity 的时候是将 Activity 放入其任务栈中,因此如果使用非 Activity 类型的 Context(如 ApplicationContext),那么启动的时候就会报错。解决的方案有两个:
FLAG_ACTIVITY_NEW_TASK 标记。