Android开发之生命周期(App、Activity)

在Android开发中,应用程序(App)和活动(Activity)的生命周期是非常重要的概念。它们各自都有一系列的生命周期方法,这些方法会在特定的时刻被系统自动调用,以便于开发者对应用或活动进行相应的操作。下面将详细探讨Android应用程序和活动的生命周期。

一、应用程序(App)生命周期

应用程序的生命周期从它被加载到内存开始,直到它完全从内存中卸载。这个生命周期可以被划分为以下几个阶段:

1. 启动阶段

当用户首次启动应用时,onCreate()方法被调用,这是整个生命周期的开始。在这个方法中,开发者可以完成应用的初始化工作,如加载数据、创建视图等。

2. 运行阶段

应用正在前台运行,用户与它进行交互。在这个阶段,onResume()方法被调用。在这个方法中,开发者可以恢复应用的状态,确保用户在离开应用后再次打开时能够继续之前的工作。

3. 暂停和停止阶段

当有其他应用或屏幕处于前台时,当前应用进入暂停或停止状态。这时会调用onPause()onStop()方法。在这个阶段,开发者可以保存应用的状态或者释放一些不必要占用的资源。

4. 重新启动阶段

当用户再次点击应用图标或从后台重新启动应用时,onRestart()方法被调用。在这个方法中,开发者可以重新初始化一些资源或者重新加载数据。

5. 销毁阶段

当应用不再需要运行并且要从内存中卸载时,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 都有自己的生命周期,Activity 的生命周期与 App 的生命周期是相互独立的。

Activity的生命周期与用户界面相关,它代表了一个特定的屏幕或界面。Activity的生命周期也分为几个关键阶段:

Android开发之生命周期(App、Activity)_第1张图片

1. 创建阶段

当新的活动实例首次被创建时,onCreate()方法被调用。这是初始化视图、数据和其他资源的好时机。开发者可以在这个方法中设置布局、初始化组件等。

2. 开始阶段

在活动首次变得可见时,onStart()方法被调用。在这个方法中,开发者可以执行一些准备工作,例如检查权限等。

3. 运行阶段

活动在前台运行并与用户交互。这是onResume()方法被调用的时刻。在这个方法中,开发者可以恢复界面状态、处理用户输入等。

4. 暂停和停止阶段

当有其他活动或屏幕覆盖当前活动时,onPause()onStop()方法被调用。在这个阶段,开发者可以保存界面状态或者释放一些不必要占用的资源。

5. 重新启动和恢复阶段

当用户返回到这个活动时,onRestart()onResume()方法会被再次调用。在这个方法中,开发者可以重新加载数据或者恢复界面状态。

6. 销毁阶段

当活动不再需要并且要被销毁时,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 的生命周期中,onCreate 方法只会调用一次,其他方法可能会被调用多次。
  • 在 Activity 的生命周期中,onPause 方法和 onStop 方法可能会被调用多次,但它们的顺序是固定的:onPause 方法会在 onStop 方法之前调用。
  • 在 Activity 的生命周期中,onDestroy 方法只会在 Activity 被销毁时调用一次。

三 在 Activity 之间导航

在应用的生命周期中,应用很可能会多次进入和退出 Activity。例如,用户可以点按设备的返回按钮,或者 Activity 可能需要启动不同的 Activity。本部分介绍了实现成功的 Activity 转换需要了解的主题。这些主题包括从另一个 Activity 启动 Activity、保存 Activity 状态,以及恢复 Activity 状态。

从一个 Activity 启动另一个 Activity
Activity 通常需要在某个时刻启动另一个 Activity。例如,当应用需要从当前屏幕移动到新屏幕时,就会出现这种需求。

根据您的 Activity 是否希望从即将启动的新 Activity 中获取返回结果,您可以使用 startActivity()startActivityForResult() 方法启动新 Activity。这两种方法都需要传入一个 Intent 对象。

Intent 对象指定您要启动的具体 Activity,或描述您要执行的操作类型(系统为您选择相应的 Activity,该 Activity 甚至可以来自不同应用)。Intent 对象还可以携带由已启动的 Activity 使用的少量数据。

startActivity()

如果新启动的 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 会继续运行。

startActivityForResult()

有时,您会希望在 Activity 结束时从 Activity 中获取返回结果。例如,您可以启动一项 Activity,让用户在联系人列表中选择收件人;当 Activity 结束时,系统将返回用户选择的收件人。为此,您可以调用 startActivityForResult(Intent, int) 方法,其中整数参数会标识该调用。此标识符用于消除来自同一 Activity 的多次 startActivityForResult(Intent, int) 调用之间的歧义。这不是全局标识符,不存在与其他应用或 Activity 冲突的风险。结果通过 onActivityResult(int, int, Intent) 方法返回。

当子级 Activity 退出时,它可以调用 setResult(int) 将数据返回到其父级。子级 Activity 必须始终提供结果代码,该结果代码可以是标准结果 RESULT_CANCELEDRESULT_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 在同一个进程(应用)中,并且其中一个要启动另一个时。以下是 Activity A 启动 Activity B 时的操作发生顺序:

  • Activity A 的 onPause() 方法执行。
  • Activity B 的 onCreate()onStart()onResume() 方法依次执行(Activity B 现在具有用户焦点)。
  • 然后,如果 Activity A 在屏幕上不再显示,其 onStop() 方法执行。

您可以利用这种可预测的生命周期回调顺序管理从一个 Activity 到另一个 Activity 的信息转换。

总结

应用程序(App)和活动(Activity)的生命周期是Android开发中的重要概念。了解这些生命周期方法可以帮助开发者更好地管理资源、优化性能并提高用户体验。通过合理地使用这些生命周期方法,开发者可以确保应用或活动在各种情况下都能够稳定、流畅地运行。在开发过程中,遵循这些生命周期方法是至关重要的,以确保应用的稳定性和性能。

参考

  • Android 开发者文档 - 了解 Activity 生命周期
  • 使用生命周期感知型组件处理生命周期
  • Android 官方示例代码
  • Android 官方培训课程

你可能感兴趣的:(Android原生App开发,android,生命周期,Activity)