`

应用组件-activity的lifecycle

阅读更多

管理activity的生命周期

通过实现回调方法来管理activity的生命周期。一个activity的生命周期受与它关联的其它activity,task和back stack的影响。

一个activity存在3种状态:

  • resumed(running)-activity运行在前台并且获得用户焦点。
  • paused-另一个activity运行在前台并且获得用户焦点,但是当前activity仍然可见,paused状态下的activity仍然存活(保持同window manager的联系),但是当内存不足的时候可能会被系统kill掉。
  • stopped-当前activity完全被另一个activity隐藏掉(用户不可见),并且运行在后台。stopped状态下的activity仍然存活(但是失去了与window manager的联系),但是当内存不足的时候可能会被系统kill掉。

当activity处于paused或者stopped状态的时候,系统可以通过调用它的finish方法或者直接kill掉activity。当activity被再次打开的时候,系统需要整个从头创建该activity。

 

实现生命周期回调

当一个activity的状态发生变化的时候,系统会通过调用各种回调方法来通知activity,你可以覆盖回调方法,在状态变化的时候做你想做的事情(必须先调用父类的回调方法,然后再追加你自己的实现)。

public class ExampleActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // The activity is being created.
    }
    @Override
    protected void onStart() {
        super.onStart();
        // The activity is about to become visible.
    }
    @Override
    protected void onResume() {
        super.onResume();
        // The activity has become visible (it is now "resumed").
    }
    @Override
    protected void onPause() {
        super.onPause();
        // Another activity is taking focus (this activity is about to be "paused").
    }
    @Override
    protected void onStop() {
        super.onStop();
        // The activity is no longer visible (it is now "stopped")
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // The activity is about to be destroyed.
    }
}

这些回调方法包括3个闭环:

  • entire lifetime-从onCreate到onDestroy,比如在onCreate里面开始一个线程,然后在onDestroy里面结束该线程。
  • visible lifetime-从onStart到onStop,比如在onStart里面注册一个BroadcastReceiver来监视UI的各种变化,然后在onStop里面取消注册(因为此时用户已经看不到该activity)。
  • foreground lifetime-从onResume到onPause,onPause一般在屏幕休眠或者弹出对话框的时候被调用。因为foreground lifetime执行比较频繁,所以在onResume和onPause方法中的代码要力求简洁并且保证快速执行,以提高用户的使用体验。

保存activity的状态

activity处于paused或者stopped状态的时候,activity对象仍然被保存在内存中,所以当activity再次进入前台的时候,原来的状态信息仍然存在。但是,为了释放内存,系统销毁掉activity以后,activity的状态信息也不复存在,这时,用户再次进入activity的时候,原来的状态信息将不复存在。为了保存重要的状态信息,可以通过覆盖onSaveInstanceState方法来实现。

当activity处于容易被销毁的状态的情况下,比如:onStop之前或者onPause之前,会调用onSaveInstanceState方法,并传入一个Bundle对象,你可以把要保存的状态信息以key-value pair的方式存入Bundle对象,这样系统销毁activity之后,用户再次进入activity的时候,系统会把之前保存好的Bundle对象传给onCreate方法和onRestoreInstanceState方法,你可以从Bundle对象中取出之前保存的状态信息。

 

但是,并不能确保activity在销毁前一定会调用onSaveInstanceState方法,因为有些情况下不需要保存状态信息,比如用户明确点击后退按钮退出activity。

 

即使你不实现onSaveInstanceState,activity的缺省实现也会保存一部分状态信息,它会分别调用layout中的每个view的onSaveInstanceState方法,大部分widget都会保存自己的状态信息,比如EditText会保存用户输入的信息,CheckBox会保存check状态,唯一需要你做的是为每个想保存状态信息的widget提供一个唯一的android:id。

<TextView android:id="@+id/nameTextbox"/>

aapt工具会自动在R.java中生成一个唯一的整型id,在代码中可以像下面这样直接引用。

findViewById(R.id.nameTextbox);

虽然activity的缺省实现会保存UI的一些信息,但是你可能仍然需要覆盖它来保存一些其他的状态信息,为了保留UI的状态信息,在覆盖onSaveInstanceState和onRestoreInstanceState方法的时候要先调用父类的实现,然后在后面追加你自己的实现。

 

因为onSaveInstanceState不能保证100%调用,所以,你应该只保存一些临时的状态信息,而不能用来保存持久化的数据,持久化的数据应该在onPause方法中进行保存(比如插入数据库,写入文件等)。

 

测试你的应用恢复状态信息的能力的一个比较好的方法是,旋转你的设备。因为屏幕方向变化的时候,为了应用相应的资源文件,系统会销毁并重建activity。因为用户在使用应用的时候会经常旋转屏幕,所以确保你的activity在旋转屏幕的时候能够完整地恢复状态信息是十分重要的。

 

处理配置变更

一些设备可以在运行的时候改变设置,比如:屏幕的方向,可用的键盘,语言。此时,android会重新创建所有运行中的activity(onDestroy,然后onCreate)。这种机制为了帮助你的应用自动重新使用你提供的相应的资源,比如:不同的layout,不同的屏幕方向和大小。

 

协调activities

当一个activity启动了另一个activity,那么这两个activity都发生了状态的变化,第一个activity先onPause再onStop,另一个activity先onCreate,再onStart,onResume。

activity A启动activity B的过程如下:

  1. 执行activity A的onPause
  2. 执行activity B的onCreate,onStart,onResume(此时,B已经获得了焦点)
  3. 如果A在屏幕上不可见,那么,再执行activity A的onStop方法

如果你需要在activity A stop的时候把一些数据写入数据库,然后在activity B中需要使用这些写入的数据,那么你必须在activity A的onPause方法中写入数据库,而不是onStop方法。

分享到:
评论

相关推荐

    Activity Lifecycle demo

    在Android应用开发中,Activity是用户界面的主要组件,它负责与用户进行交互。"Activity Lifecycle demo"是一个关于Android活动生命周期的示例项目,通过这个项目,开发者可以深入理解Activity在不同状态之间的转换...

    Activity的生命周期(LifeCycle)

    ### Activity的生命周期(LifeCycle) #### 一、Activity在Android中的地位 在Android开发中,Activity作为四大组件之首,其重要性不言而喻。四大组件包括:Activity(负责界面控制)、Service(用于维持一个进程...

    Activity-Lifecycle-06

    在Android开发领域,Activity是应用中的核心组件,它负责与用户进行交互,展现应用程序的界面。...通过学习和实践"Activity-Lifecycle-06"这样的项目,开发者能够更好地控制和优化其应用程序的行为,提升用户体验。

    博客资料 -JetpackLifeCycle 架构组件

    【Jetpack】Lifecycle 架构组件 ( 系统组件与普通组件解耦 | Lifecycle 解耦系统组件与普通组件 | 解耦服务组件与普通组件 | 监听应用程序生命周期 ) https://hanshuliang.blog.csdn.net/article/details/129291874...

    Android高级应用源码-100多个Android 实例集合.zip

    16. **Android Jetpack组件**:包括Lifecycle、Navigation、WorkManager等,这些组件可以简化开发,提高代码质量。 通过分析这些源码实例,开发者不仅可以了解每个知识点的运用,还能学习到实际项目中的最佳实践,...

    Android应用---充电宝app源码.zip

    可能在项目中看到的Jetpack组件包括Lifecycle、Room、Paging等。 12. **性能优化**: - 作为一款工具应用,优化电池使用是核心。源码可能包含对电池使用情况的检测、分析,以及针对低电量模式的优化策略。 通过对...

    Android Activity 生命周期(lifecycle)的研究

    AndroidManifest.xml是应用的核心配置文件,定义了应用组件、权限和其他重要信息;bin目录包含编译后的文件;res目录存放应用资源;assets目录用于放置非结构化的资源文件;gen目录存放自动生成的R.java文件;src...

    Prob1-Understanding-the-Life-Cycle-of-an-Activity

    在Android应用开发中,`Activity`是用户界面的主要载体,它是应用程序中负责与用户交互的组件。本项目"Prob1-Understanding-the-Life-Cycle-of-an-Activity"旨在深入理解`Activity`的生命周期,这对于开发高效、响应...

    Android开发指南中文版

    Android应用程序是由多个组件构成的,每个组件都有特定的功能。 - **Activity**:用户界面的核心部分。 - **Service**:后台运行的服务。 - **BroadcastReceiver**:用于接收广播消息。 - **ContentProvider**:...

    Android高级应用源码-data.zip

    11. **Jetpack组件**:Android Jetpack是一组库、工具和指南,简化了Android开发,包括Lifecycle、Navigation、Paging等组件,它们能帮助开发者构建高质量、可维护的应用。 12. **自定义View和动画**:高级应用可能...

    android-activity-detector:用于检测用户活动并在列表上显示实时更新的应用程序

    在Android开发中,Activity是应用程序的核心组件之一,它负责用户界面的展示和交互。`android-activity-detector`项目则是对Activity生命周期进行监控的实现,以便于了解用户在何时何地与哪些应用进行了互动。它利用...

    Android应用源码-Android安卓设计实例源代码23个合集.zip

    Fragment则是可嵌入到Activity中的模块化组件,用于构建适应不同屏幕尺寸的应用。 2. **布局管理器(Layout Manager)**:如LinearLayout、RelativeLayout、ConstraintLayout等,它们决定了UI元素在屏幕上的排列...

    Android中的生命周期LifeCycle

    Lifecycle-aware components是Android Jetpack的一部分,它提供了一种声明式的方式来管理组件的生命周期,如LiveData和ViewModel,可以减少生命周期管理的复杂性并防止内存泄漏。 LiveData是一种观察者模式实现,...

    viewModel,liveData,lifecycle的简单使用demo

    `Lifecycle` 组件则是一组接口和类,用于跟踪 Android 应用组件(如 Activity 和 Fragment)的生命周期状态。它允许第三方库和其他组件更好地与应用的生命周期同步,确保在正确的时间执行操作。通过 Lifecycle,我们...

    Android高级应用源码-TreeCore Android应用框架.zip

    5. **生命周期管理**:TreeCore可能实现了对Activity和Fragment生命周期的精细化管理,比如使用Lifecycle库,以防止内存泄漏和不必要的资源消耗。 6. **异步处理**:框架可能利用了RxJava或Coroutines进行异步操作...

    Android-Lifecycle:探索 Android Activity 生命周期

    在Android应用开发中,Activity是用户界面的主要组件,它的生命周期是开发者必须深入理解的关键概念。本文将详尽探讨Android Activity的生命周期,以及如何在Java编程中有效地管理它。 Activity生命周期包含了一...

    Activity生命周期demo

    Activity是Android应用开发中的核心组件,它代表了用户与应用交互的界面。了解并掌握Activity的生命周期对于构建高效、响应迅速且用户体验良好的Android应用至关重要。谷歌官方提供的Activity生命周期示例(...

    Android-Lifecycle

    Android应用程序主要由各种组件构成,其中最常见的就是Activity,它代表用户界面的一个屏幕。`Android-Lifecycle`这个主题深入探讨的就是Activity的生命周期,以及如何在不同的状态下管理应用程序的行为。 Activity...

    Lifecycle源码原理解析

    在Android开发中,Jetpack库是Google推荐的重要组件之一,其中Lifecycle组件对于管理Activity和Fragment的生命周期至关重要。本文将深入探讨Lifecycle源码的原理和实现机制,帮助开发者更好地理解和运用这个强大的...

Global site tag (gtag.js) - Google Analytics