我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android中Activity的生命周期探讨

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android中Activity的生命周期探讨

1、完整生命周期

上图是Android Activity的生命周期图,其中Resumed、Paused、Stopped状态是静态的,这三个状态下的Activity存在时间较长。

(1)Resumed:在此状态时,用户可以与Activity进行交互,Activity在最前端
(2)Paused:在此状态时,Activity被另外一个Activity遮盖,此Activity不可接受用户输入信息。另外一个Activity来到最前面,半透明的,但并不会覆盖整个屏幕。
(3)Stopped:在此状态时,Activity完全被隐藏,不可见。保留当前信息,Activity不执行任何代码。
(4)Created与Started:系统调用onCreate()后迅速调用onStart(),然后迅速执行onResume()。

以上就是Android的Activity整个生命周期。

2、主Activity

用户可以指定程序启动的主界面,此时被声明为“launcher或main”Activity的onCreate()方法被调用,成为程序的入口函数。该入口Activity可以在AndroidManifest.xml中定义主Activity。此时,主Activity必须使用以下标签声明:
代码如下:
<activity android:name=".MainActivity" android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

3、一个新的Activity实例

系统首先调用新Activity的onCreate()方法,所以,我们必须实现onCreate()方法。如:声明UI元素、定义成员变量、配置UI等。但是事情不宜太多,避免启动程序太久而看不到界面。

代码如下:
TextView mTextView; // Member variable for text view in the layout

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set the user interface layout for this Activity
    // The layout file is defined in the project res/layout/main_activity.xml
file
    setContentView(R.layout.main_activity);

    // Initialize member TextView so we can manipulate it later
    mTextView = (TextView) findViewById(R.id.text_message);

    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        // For the main activity, make sure the app icon in the action bar
        // does not behave as a button
        ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
    }
}

onCreate()执行完即调用onStart()和onResume()方法,Activity不会在Created或者Started状态停留。

4、销毁Activity

Activity的最后一个回调是onDestroy(),系统会执行这个方法做为你的Activity要从系统中完全删除的信号。大多数APP不需实现此方法,因为局部类的references会随着Activity的销毁而销毁。并且Activity应该在onPause()和onStop()方法中执行清楚Activity资源的操作。如果Activity在onCreate()时创建的后台线程,或者是其他有可能导致内存泄露的资源,你应该在onDestroy()时杀死它们。
代码如下:
@Override
public void onDestroy() {
    super.onDestroy();  // Always call the superclass

    // Stop method tracing that the activity started during onCreate()
    android.os.Debug.stopMethodTracing();
}

系统通常是在执行了onPause()与onStop()后在调用onDestroy(),除非在onCreate()中调用了finish()。例如,如果你的Activity只是做了一个临时的逻辑跳转功能,它使用用来决定跳转到下一个Activity,这样,你需要在onCreate()中调用finish()方法。系统就会直接调用onDestroy方法,其他生命周期就不会被执行。

5、暂停与恢复

当前Activity被其它可见组件阻塞,当前Activity部分可见,当前Activity进入Pause状态。系统调用Activity中的onPause()方法,执行onResume()方法恢复。

当前Activity被其它组件完全阻塞,当前Activity完全不可见,则当前Activity进入Stop状态。

当系统调用你的Activity中的onPause(),从技术上讲,那意味着你的Activity仍然处于部分可见的状态。通常在onPause()回调方法里面做下面的事情。

(1)停止动画或者其他正在运行的操作,减少CPU浪费
(2)提交没有保存的改变,但仅仅是用户离开时保存的内容,如邮件
(3)释放系统资源,如broadcast receivers、sensors、GPS或者其他任何影响电量的资源。
(4)如果程序正在使用Camera,onPause()会是一个比较好的地方去释放资源的操作。

代码如下:
@Override
public void onPause() {
    super.onPause();  // Always call the superclass method first

    // Release the Camera because we don't need it when paused
    // and other activities might need to use it.
    if (mCamera != null) {
        mCamera.release()
        mCamera = null;
    }
}

通常,不应该使用onPause()来保存用户改变的数据到永久存储上,当你确认用户期待那些改变能够自动保存的时候,才可以把那些数据存储到永久存储。然而,应该避免在onPause()时执行CPU-intensive的工作,例如写数据到DB,因为他会导致切换Activity变得缓慢。这些工作应该放到onStop()中去坐。

如果,Activity实际上要被Stop,那么应减少在onPause中的工作量,提高流畅性。

恢复Activity

用户从Pause状态恢复时,调用onResume()方法。此时Activity处于最前台,包括第一次创建时,此时,应该在onResume中初始化那些你在onPause方法里释放掉的组件,并执行那些Activity每次进入Resumed state都需要的初始化动作。
代码如下:
@Override
public void onResume() {
    super.onResume();  // Always call the superclass method first

    // Get the Camera instance as the activity achieves full user focus
    if (mCamera == null) {
        initializeCamera(); // Local method to handle camera init
    }
}

6、停止与重启Activity

恰当的停止与重启Activity会使用户感知程序的进行。下面一些场景涉及停止与重启:

(1)用户打开最近使用的App的菜单并切换到另外一个App,此时,你的App是被停止的,用户回到你的App,那么你的Activity被重启。
(2)用户在App中启动一个新的Activity的操作,当前Activity会在新Activity创建后stop,如果用户点击back按钮,回到上一个Activity,重启
(3)用户使用App,接到来电时。

停止状态UI不可见。系统在Activity停止时会在内存中保存了Activity实例,有时不需事先onStop(),onRestart()甚至onStart()方法,因为大多数的activity相对简单,activity会自己停止与重启。你只需要使用onPause来停止正在运行的动作,并断开系统资源链接。

上图显示:当用户离开你的Activity,系统会调用onStop()来停止Activity,用户返回时调用onRestart(),然后迅速调用onStart()与onResume(),无论什么原因导致Activity停止,系统总会在onStop之前调用onPause

停止Activity

当你的Activity调用onStop方法,Activity不再可见,并且应该释放那些不再需要的所有资源,一旦你的Activity停止了,系统会在不需要的这个activity时销毁它的实例。在极端情况下,系统会直接杀死你的App进程,并且不执行Activity的onDestroy()回调函数,因此你需要在onStop()来释放资源,否则内存泄露。尽管onPause方法在onStop之前调用,应应该使用onStop来执行CPU-intensive的shut-down操作。如写数据到DB。

当Activity停止,其对象会保存在内存中,并且在Resume时重新调用,不需在恢复到Resumed state状态前初始化那些被保存在内存中得组件,系统为我们保存了每一个在布局中的视图的当前状态。即使系统会在Activity stop时销毁这个Activity,它仍然会保存View对象的状态到一个Bundle中,并且在用户返回这个Activity时恢复他们。

重新创建Activity:当Activity在屏幕被旋转时,会被destroy与recreated。此时会加载一些alternative的资源,如layout。默认情况下,系统使用Bundle实例来保存每一个视图对象中得信息。为了使Android系统能够恢复Activity中的View状态,每个View都必须有一个唯一的ID

为了确保额外更多的数据到saved instance state,在Activity的声明周期里面存在一个添加的回调函数,必须重写onSaveInstanceState(),当用户离开你的Activity时,系统会调用它。当系统调用这个函数时,系统会在你的Activity被一场Destroy时传递Bundle对象,这样,你可以增加额外的信息到Bundle中,并保存在系统中。如果系统在Activity被Destroy之后想重新创建这个Activity实例时,之前的那个Bundle对象会被传递到Activity的onRestoreInstanceState()方法和onCreate()方法中。

保存Activity状态:当Activity开始Stop时,系统会调用onSaveInstanceState(),因此你的Activity可以用键值对的集合来保存状态信息,这个方法会默认保存Activity视图的状态信息,例如在EditText组件中得文本或者是ListView的滑动位置。为了给Activity保存额外的状态信息,你必须实现onSaveInstanceState()并增加键值对到Bundle中。如:

代码如下:
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

恢复Activity状态:当你的Activity从Destroy中重建,你可以从系统传递给你的Activity的Bundle中恢复保存的状态。onCreate()与onRestoreInstanceState()回调方法都接收到了同样的Bundle,里面包含同样的实例状态信息。因为onCreate()方法会在第一次创建新的Activity实例与重新创建之前被Destroy的实例时都被调用,你必须尝试读取Bundle对象之前检查它是否为NULL,如果为NULL,系统第一次创建新Activity。否则是恢复被Destroy的Activity。

代码如下:
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first

    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}

我们可以选择实现onRestoreInstanceState(),而不是在onCreate方法里恢复数据。onRestoreInstanceState()方法会在onStart()方法之后执行,系统仅仅会在存在需要恢复的状态信息时才会调用onRestoreInstanceState(),因此不需检查Bundle是否为NULL。

代码如下:
public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);

    // Restore state members from saved instance
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}

您可能感兴趣的文章:Android Activity的生命周期详细介绍android中Activity详解(生命周期、以各种方式启动Activity、状态保存,完全退出等)android基础总结篇之一:Activity生命周期Android Activity生命周期详解Android中Activity生命周期和启动模式详解Android开发之activity的生命周期详解Android基础之Activity生命周期Android开发系列二之窗口Activity的生命周期Android Activity 横竖屏切换的生命周期Android中Fragment与Activity的生命周期对比深入解读Android开发中Activity的生命周期Android中的Activity生命周期总结Activity生命周期实例讲解两分钟让你彻底明白Android Activity生命周期的详解(图文介绍)Activity跳转时生命周期跟踪的实例


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android中Activity的生命周期探讨

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android中Activity的生命周期探讨

1、完整生命周期 上图是Android Activity的生命周期图,其中Resumed、Paused、Stopped状态是静态的,这三个状态下的Activity存在时间较长。 (1)Resumed:在此状态时,用户可以与Activity进
2022-06-06

Android中的Activity生命周期总结

概述 有图有真相,所以先上图:上图是从Android官网截下的Activity的生命周期流程图,结构非常清晰,它描述了Activity在其生命周期中所有可能发生的情况以及发生的先后顺序,下面就将结合此图详细介绍一下Activity的生命周期
2022-06-06

《Android》Activity生命周期详解

1、什么是Activity的生命周期? 用户在使用一个应用程序时,随着应用的启动、页面的跳转、进入后台等一些操作的发生,Activity会回调一些固定的方法,这些回调方法标识了Activity的状态改变,比如创建、销毁、暂停、进入后台等等。
2022-06-06

Android Activity生命周期详解

Activity 的生命周期。 一、理解ActivityActivity是Android程序的4大组件之一。Activity是Android程序的表示层。程序的每一个显示屏幕就是一个Activity。学过WEB开发的同学,可以把Activi
2022-06-06

Android Activity的生命周期、意图(Intent)

package cn.lwx.activitycreate; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android
2022-06-06

Android基础之Activity生命周期

子曰:温故而知新,可以为师矣。《论语》 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就完全掌握,那基本不大可能,所以我们需要经常回过头再仔细研读几遍,以领悟到作者的思想精髓。 近来回顾了一下关于Activity的生命周期,
2022-06-06

Android中Fragment与Activity的生命周期对比

Fragment必须是依存于Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期。官网这张图很好的说明了俩者的关系:可以看到Fragment比Activity多了几个额外的生命周期回调函数:onAt
2022-06-06

Android Activity的生命周期详细介绍

Android Activity的生命周期详细介绍 生命周期描述的是一个类从创建(new出来)到死亡(垃圾回收)的过程中会执行的方法。在这个过程中,会针对不同的生命阶段调用不同的的方法。 Activity是Android中四大组
2022-06-06

Android开发之activity的生命周期详解

本文实例讲述了Android activity的生命周期。分享给大家供大家参考,具体如下: activity类处于android.app包中,继承体系如下: 1.Java.lang.Object 2.android.content.Cont
2022-06-06

Android Activity 横竖屏切换的生命周期

前言 在开发中常要处理横竖屏切换,怎么处理先看生命周期 申明 Activity 横竖屏切换时需要回调两个函数 ,所以在此将这个两个函数暂时看成是Activity 横竖屏切换的生命周期的一部分,这两个函数如下onSaveInstanceSta
2022-06-06

Android中Activity生命周期调用的示例分析

这篇文章将为大家详细讲解有关Android中Activity生命周期调用的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。状态活动存放在一个叫返回栈的一个集合,当重新打开一个Activity时,它就
2023-06-22

Android项目中如何使用Activity的生命周期

Android项目中如何使用Activity的生命周期?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Android Activity的生命周期详细介绍生命周期描述的是一个类
2023-05-31

深入解读Android开发中Activity的生命周期

什么是Activity 首先,Activity是Android系统中的四大组件之一,可以用于显示View。Activity是一个与用记交互的系统模块,几乎所有的Activity都是和用户进行交互的,但是如果这样就能说Activ
2022-06-06

Activity的生命周期有哪些

这期内容当中小编将会给大家带来有关Activity的生命周期有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Android中Activity的生命周期,网上大多数文章基本都是直接贴图、翻译API,比较
2023-05-31

Android中Activity生命周期和启动模式详解

Activity生命周期经典图解:按键对生命周期的影响:BACK键:当我们按BACK键时,我们这个应用程序将结束,这时候我们将先后调用onPause()->onStop()->onDestory()三个方法。 再次启动App时,会执行onC
2022-06-06

探讨数据在Hadoop中的生命周期管理策略

Hadoop中的数据生命周期管理策略是指对数据在Hadoop集群中的存储、访问和处理过程进行管理和优化的一种策略。以下是一些常见的数据生命周期管理策略:数据存储策略:根据数据的重要性和访问频率,将数据存储在不同的存储介质中,如将频繁访问的数
探讨数据在Hadoop中的生命周期管理策略
2024-02-29

android基础总结篇之一:Activity生命周期

近来回顾了一下关于Activity的生命周期,参看了相关书籍和官方文档,也有了不小的收获,对于以前的认知有了很大程度上的改善,在这里和大家分享一下。熟悉javaEE的朋友们都了解servlet技术,我们想要实现一个自己的servlet,需要
2022-06-06

android横竖屏切换时候Activity的生命周期

1、新建一个Activity,并把各个生命周期打印出来 2、运行Activity,得到如下信息 onCreate--> onStart--> onResume--> 3、按crtl+f12切换成横屏时 onSaveInstanceState
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录