在Android开发中,应用程序(App)和活动(Activity)的生命周期是非常重要的概念。它们各自都有一系列的生命周期方法,这些方法会在特定的时刻被系统自动调用,以便于开发者对应用或活动进行相应的操作。下面将详细探讨Android应用程序和活动的生命周期。
应用程序的生命周期从它被加载到内存开始,直到它完全从内存中卸载。这个生命周期可以被划分为以下几个阶段:
当用户首次启动应用时,onCreate()
方法被调用,这是整个生命周期的开始。在这个方法中,开发者可以完成应用的初始化工作,如加载数据、创建视图等。
应用正在前台运行,用户与它进行交互。在这个阶段,onResume()
方法被调用。在这个方法中,开发者可以恢复应用的状态,确保用户在离开应用后再次打开时能够继续之前的工作。
当有其他应用或屏幕处于前台时,当前应用进入暂停或停止状态。这时会调用onPause()
和onStop()
方法。在这个阶段,开发者可以保存应用的状态或者释放一些不必要占用的资源。
当用户再次点击应用图标或从后台重新启动应用时,onRestart()
方法被调用。在这个方法中,开发者可以重新初始化一些资源或者重新加载数据。
当应用不再需要运行并且要从内存中卸载时,onDestroy()
方法被调用。在这个方法中,开发者可以释放所有占用的资源,确保应用完全退出。
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 初始化应用程序的代码
Log.d("MyApplication", "onCreate() is called.");
}
@Override
public void onStart() {
super.onStart();
// 启动应用程序的代码
Log.d("MyApplication", "onStart() is called.");
}
@Override
public void onResume() {
super.onResume();
// 恢复应用程序的代码
Log.d("MyApplication", "onResume() is called.");
}
@Override
public void onPause() {
super.onPause();
// 暂停应用程序的代码
Log.d("MyApplication", "onPause() is called.");
}
@Override
public void onStop() {
super.onStop();
// 停止应用程序的代码
Log.d("MyApplication", "onStop() is called.");
}
@Override
public void onDestroy() {
super.onDestroy();
// 销毁应用程序的代码
Log.d("MyApplication", "onDestroy() is called.");
}
}
每个 Activity 都有自己的生命周期,Activity 的生命周期与 App 的生命周期是相互独立的。
Activity的生命周期与用户界面相关,它代表了一个特定的屏幕或界面。Activity的生命周期也分为几个关键阶段:
当新的活动实例首次被创建时,onCreate()
方法被调用。这是初始化视图、数据和其他资源的好时机。开发者可以在这个方法中设置布局、初始化组件等。
在活动首次变得可见时,onStart()
方法被调用。在这个方法中,开发者可以执行一些准备工作,例如检查权限等。
活动在前台运行并与用户交互。这是onResume()
方法被调用的时刻。在这个方法中,开发者可以恢复界面状态、处理用户输入等。
当有其他活动或屏幕覆盖当前活动时,onPause()
和onStop()
方法被调用。在这个阶段,开发者可以保存界面状态或者释放一些不必要占用的资源。
当用户返回到这个活动时,onRestart()
和onResume()
方法会被再次调用。在这个方法中,开发者可以重新加载数据或者恢复界面状态。
当活动不再需要并且要被销毁时,onDestroy()
方法被调用。在这个方法中,开发者可以释放所有占用的资源,确保活动完全退出。
public class MyActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化 Activity 的各种资源
Log.d("MyActivity", "onCreate() is called.");
}
@Override
protected void onStart() {
super.onStart();
// 做一些 Activity 启动时需要做的事情,例如加载数据等
Log.d("MyActivity", "onStart() is called.");
}
@Override
protected void onResume() {
super.onResume();
// 做一些 Activity 运行时需要做的事情,例如更新 UI 等
Log.d("MyActivity", "onResume() is called.");
}
@Override
protected void onPause() {
super.onPause();
// 做一些 Activity 暂停时需要做的事情,例如停止更新 UI 等
Log.d("MyActivity", "onPause() is called.");
}
@Override
protected void onStop() {
super.onStop();
// 做一些 Activity 停止时需要做的事情,例如释放资源等
Log.d("MyActivity", "onStop() is called.");
}
@Override
protected void onDestroy() {
super.onDestroy();
// 做一些 Activity 销毁时需要做的事情,例如清除数据等
Log.d("MyActivity", "onDestroy() is called.");
}
}
注意:
在应用的生命周期中,应用很可能会多次进入和退出 Activity。例如,用户可以点按设备的返回按钮,或者 Activity 可能需要启动不同的 Activity。本部分介绍了实现成功的 Activity 转换需要了解的主题。这些主题包括从另一个 Activity 启动 Activity、保存 Activity 状态,以及恢复 Activity 状态。
从一个 Activity 启动另一个 Activity
Activity 通常需要在某个时刻启动另一个 Activity。例如,当应用需要从当前屏幕移动到新屏幕时,就会出现这种需求。
根据您的 Activity 是否希望从即将启动的新 Activity 中获取返回结果,您可以使用 startActivity()
或 startActivityForResult()
方法启动新 Activity。这两种方法都需要传入一个 Intent
对象。
Intent
对象指定您要启动的具体 Activity,或描述您要执行的操作类型(系统为您选择相应的 Activity,该 Activity 甚至可以来自不同应用)。Intent 对象还可以携带由已启动的 Activity 使用的少量数据。
如果新启动的 Activity 不需要返回结果,当前 Activity 可以通过调用 startActivity()
方法来启动它。
在自己的应用中工作时,您通常只需启动已知 Activity。例如,以下代码段显示如何启动一个名为 SignInActivity 的 Activity。
Intent intent = new Intent(this, SignInActivity.class);
startActivity(intent);
您的应用可能还希望使用 Activity 中的数据执行某些操作,例如发送电子邮件、短信或状态更新。在这种情况下,您的应用自身可能不具有执行此类操作所需的 Activity,因此您可以改为利用设备上其他应用提供的 Activity 为您执行这些操作。这便是 intent 的真正价值所在。您可以创建一个 intent,对您想执行的操作进行描述,系统会从其他应用启动相应的 Activity。如果有多个 Activity 可以处理 intent,用户可以选择要使用哪一个。例如,如果您想允许用户发送电子邮件,可以创建以下 intent:
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
startActivity(intent);
添加到 intent 中的 EXTRA_EMAIL
extra 是一个字符串数组,其中包含电子邮件的收件人电子邮件地址。当电子邮件应用响应此 intent 时,该应用会读取 extra 中提供的字符串数组,并将该数组放入电子邮件撰写表单的“收件人”字段。在这种情况下,电子邮件应用的 Activity 会启动,并且当用户完成操作时,您的 Activity 会继续运行。
有时,您会希望在 Activity 结束时从 Activity 中获取返回结果。例如,您可以启动一项 Activity,让用户在联系人列表中选择收件人;当 Activity 结束时,系统将返回用户选择的收件人。为此,您可以调用 startActivityForResult(Intent, int)
方法,其中整数参数会标识该调用。此标识符用于消除来自同一 Activity 的多次 startActivityForResult(Intent, int)
调用之间的歧义。这不是全局标识符,不存在与其他应用或 Activity 冲突的风险。结果通过 onActivityResult(int, int, Intent)
方法返回。
当子级 Activity 退出时,它可以调用 setResult(int)
将数据返回到其父级。子级 Activity 必须始终提供结果代码,该结果代码可以是标准结果 RESULT_CANCELED
、RESULT_OK
,也可以是从 RESULT_FIRST_USER
开始的任何自定义值。此外,子级 Activity 可以根据需要返回包含它所需的任何其他数据的 Intent
对象。父级 Activity 使用 onActivityResult(int, int, Intent)
方法,以及父级 Activity 最初提供的整数标识符来接收信息。
如果子级 Activity 由于任何原因(例如崩溃)而失败,父级 Activity 将收到代码为 RESULT_CANCELED
的结果。
public class MyActivity extends Activity {
// ...
static final int PICK_CONTACT_REQUEST = 0;
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
// When the user center presses, let them pick a contact.
startActivityForResult(
new Intent(Intent.ACTION_PICK,
new Uri("content://contacts")),
PICK_CONTACT_REQUEST);
return true;
}
return false;
}
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
if (requestCode == PICK_CONTACT_REQUEST) {
if (resultCode == RESULT_OK) {
// A contact was picked. Here we will just display it
// to the user.
startActivity(new Intent(Intent.ACTION_VIEW, data));
}
}
}
}
当一个 Activity 启动另一个 Activity 时,它们都会经历生命周期转换。第一个 Activity 停止运行并进入“已暂停”或“已停止”状态,同时创建另一个 Activity。如果这些 Activity 共享保存到磁盘或其他位置的数据,必须要明确第一个 Activity 在创建第二个 Activity 之前并未完全停止。相反,启动第二个 Activity 的过程与停止第一个 Activity 的过程重叠。
生命周期回调的顺序已有明确定义,特别是当两个 Activity 在同一个进程(应用)中,并且其中一个要启动另一个时。以下是 Activity A 启动 Activity B 时的操作发生顺序:
onPause()
方法执行。onCreate()
、onStart()
和 onResume()
方法依次执行(Activity B 现在具有用户焦点)。onStop()
方法执行。您可以利用这种可预测的生命周期回调顺序管理从一个 Activity 到另一个 Activity 的信息转换。
应用程序(App)和活动(Activity)的生命周期是Android开发中的重要概念。了解这些生命周期方法可以帮助开发者更好地管理资源、优化性能并提高用户体验。通过合理地使用这些生命周期方法,开发者可以确保应用或活动在各种情况下都能够稳定、流畅地运行。在开发过程中,遵循这些生命周期方法是至关重要的,以确保应用的稳定性和性能。