Android成长之路(3)——Activity的生命周期(1)

当用户在用一个App的时候,Activity会在生命周期不同的状态下转换。

当用户离开或重新回到一个Activity,我们可以在生命周期的回调函数中来写一些相关的操作。比如,如果用户打开了一个视频播放器,当他直接切换到另外一个App,这时候应该使播放器暂停,断开获取视频资源的网络连接。当用户回来,我们要重新连接网络获取视频资源,让用户在刚才暂停的位置开始重新观看。

接下来,开始去了解非常重要的生命周期的回调函数,学着怎么去用它们来执行一些使用户有更好体验的操作,并且当我们不需要它们时,不要消耗系统的资源。在Android系统中,不是跟其他程序一样会启动一个main()方法, 而是通过调用对应生命周期特定状态的回调函数,来开始一个Activity实例.

启动一个Activity

在一个Activity的生命周期中,其中的回调函数可以看成一个阶梯金字塔。也就是,每一个Activity生命周期的阶段就是金字塔上的一个台阶。当系统开始启动一个Activity时,其中的回调函数会让Activity一个台阶一个台阶地登上最高的那一台阶。在最高的那一层台阶,运行时Activity可以完全显示出来,和用户进行交互。

当用户退出当前的Activity,系统会调用其它的方法,让Activity从最高那层台阶往下走,它就不会在前台了。有些时候,它只是从金字塔往下走了一部分,然后在那等着(比如说用户切换到其它的App)。这个时候这个Activity还是可以往上走回到金字塔最高那一层(用户又回到了之前的Activity),用户继续在刚才离开的地方进行操作。

可能实际开发上不需要实现所有的生命周期函数,但是了解每一个函数的实现,确保App执行的是用户期望的方式,这是非常重要的。

以下是要注意的几个方面:

1、当用户有来电或者切换到其它的App,不要销毁当前的App

2、当用户没有用到系统的资源,要关掉,不要消耗系统资源

3、当用户离开App一会后再到App,不要丢失用户的进度

4、当屏幕在横向和纵向之间旋转时,不要失去用户的进度。

Activity在不同的阶段转换时,如上图。

但是,只有三个阶段是静态的。Activity只会在这三个阶段其中一个阶段上长时间停留:

Resumed

在这一阶段,Activity会显示在前台上,和用户进行交互。也就是运行的阶段。

Paused

在这个阶段,Activity会被其他的Activity部分地遮盖住,这时候的Activity不能接收用户的输入也不能执行任何代码。

Stopped

当Activity在Stopped阶段,会完全被掩盖住,用户不可见。这是的Activity实例和他的一些成员变量仍然保留,但它不会执行任何代码了。

而在其他的阶段 (Created 和 Started) 都是一瞬间的, 系统会调用下一个生命周期的函数,很快地跳到下一个阶段。所以在系统调用 onCreate()之后,它很快就会调用onStart()接着马上跟着 onResume()。

指定App的启动Activity

在AndroidManifest.xml中,可以指定哪一个Activity用作main Activity。这个main Activity要在< intent-filter >中声明,包含MAIN action 和 LAUNCHER category.

例如:

<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>

OnCreate

大部分的App都会有几个不同的Activity,当用户点击打开App时,系统会通过调用onCreate()方法来创建每个新的Activity。

必须要实现 onCreate()方法来执行一些活动的UI、数据等加载,这在整个生命周期只执行一次。例如在XML中定义用户界面口,定义成员变量,配置一些UI。

上一次DisplayActivity中的代码:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_message);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        Intent intent = getIntent();
        String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
        TextView textView = new TextView(this);
        textView.setTextSize(40);
        textView.setText(message);

        RelativeLayout layout = (RelativeLayout) findViewById(R.id.content);
        layout.addView(textView);

    }

一旦 onCreate()执行完成, 系统就会紧接着调用 onStart() 和 onResume() 方法. Activity不会停留在Created和Started这两个阶段。其实,当onStart()方法被调用的时候,用户已经可以看见Activity,只不过onResume()会马上被调用,Activity就进入在Resumed这一状态,直到用户切换到另一个App或者有来电了,又或者关闭了屏幕。

当创建一个新的Activity实例时,重点关注这三个回调方法 :onCreate(), onStart(), 和 onResume()。一旦回调方法执行完成,Activity就会到Resumed这一阶段,即Activity回到前台,用户就可以和这个Activity进行交互。

onDestroy

onCreate()在生命周期中是第一个执行的方法,而onDestroy()是生命周期中最后一个执行的方法. 系统在Activity中调用onDestroy()这个方法作为结束的信号,Activity实例会从系统内存中移除。

大部分App都不需要实现这个方法,因为Activity调用onDestroy()前,应该在onPause() 和onStop()这两个方法中执行清除内存操作。但是如果Activity中有线程是在onCreate()中或者一些长期运行的资源,如果不合适地关掉的话,会造成内存泄漏!这是时候应该在最后的onDestroy()方法中关掉它们。

@Override
public void onDestroy() {
    super.onDestroy();
}

系统在调用onPause()和onStop()方法之后,就会调用onDestroy()用。

除了一种情况:就是在onCreate()中调用finish()方法。

有时候,比如Activity执行一个临时的决策来启动另一Activity,就会在onCreate()中调用finish()方法。这种情况,系统会马上调用onDestroy()方法,不会再经过生命周期的其他回调方法。

OnPause()和onResume()

在用户使用app时,前台Activity有时被其他组件遮住,会导致Activity暂停。例如,当一个提示对话框打开,Activity就会暂停。虽然仍可以看见部分的Activity,但是Activity已经暂停,不会执行任何操作。如果Activity一旦完全被遮盖着看不见,它就停止了。会进入Stopped这一状态。

当Activity进入Paused状态,系统会在Activity中调用onPause(),比如会暂停视频,或者暂时保存 一些信息。当用户从Paused状态返回到当前的Activity,系统就会调用onResume()方法,重新回到Resumed状态。

当系统调用onPause(),Activity部分可见。但大多数的情况是,用户会离开当前的Activity,就会进入Stopped状态,最后执行onDestroy()方法。所以呢,在onPause()中会做一下几点:

1、停止会消耗CPU的动画或者正在运行的操作。

2、提交未保存的修改,比如草稿邮件/3、释放系统资源,比如广播接收器,GPS,或者当Activity暂停,而用户又不需要用到的资源

例如,App用到相机,那么onPause()方法是一个非常合适的地方来释放它

@Override
public void onPause() {
    super.onPause();  //首先调用父类的方法

    // 释放资源,因为其他的Activity可能需要用到它
    if (mCamera != null) {
        mCamera.release();
        mCamera = null;
    }
}

注意,不要在onPause()方法中执行数据库的操作,因为这会使跳转到下一个Activity很缓慢。

在onPause()执行一些相对简单的操作,以致于可以快速地跳转到下一个Activity。当Activity停止,这时候Activity实例会放在内存中,当Activity恢复时,就会重新调用这个实例,不需要再重新创建一个Activity实例。

需要知道的是,每一次系统调用onResume()方法,Activity就会回到前台,其中也包括了第一次创建实例的时候。

应该在onResume()方法中初始化一些在onPause()被释放掉的组件,还有每次恢复所需要的组件,比如一些开始的动画和需要的组件。

以下onResume()对应上面onPause()的例子,初始化在Pasued状态被释放掉的相机。

@Override
public void onResume() {
    super.onResume();  

    if (mCamera == null) {
        initializeCamera(); // 初始化相机的操作
    }
}
时间: 2024-08-02 09:33:06

Android成长之路(3)——Activity的生命周期(1)的相关文章

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

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

跟着Google学Android —— 3.1 管好Activity的生命周期

当我们在app的不同页面间穿梭翱翔的时候,app中的Activity也在他们各自的生命周期中转换着不同的状态.当用户执行进入或者是离开某个Activity的操作时,Android系统会调用一系列生命周期的回调函数进行处理,而我们也可以重写这些回调函数,让Activity在不同的状态下执行我们想要的操作. 生命周期回调方法 下图展示了一个Activity的生命周期以及回调方法.这张图看起来就像是一个梯形金字塔,每一步都对应着Activity的一种生命状态. 在这些状态中,只有如下三种状态是静态的,

android开发学习笔记(二)-activity的生命周期

一:activity的生命周期: 二:created->resumed 当一个应用程序的启动图标被用户点击后,应用程序开始从Activity的onCreate()方法开始执行.(当有多个activity文件时,执行Manifest文件中指定的主activity文件). 当执行完onCreate()方法后,迅速调用onStart(),onResume()方法,用户就可以进行相关的操作. 在onCreate()方法中尽量少执行操作,防止程序运行很久都进入不了界面. 三:Resumed->Pause

Android笔记之多个Activity的生命周期交互

单个Activity: 应用开启时调用:onCreate(),onStart(),onResume(); 按下返回键:onPause(),onStop(),onDestory(); 多个Activity之间交互时: 跳转至第二个Activity时: FirstActivity SecondActivity onPause()     onCreate()   onStart()   onResume() onStop()   按下锁屏键 SecondActivity onPause() onSt

Android开发艺术探索——第一章:Activity的生命周期和启动模式

Android开发艺术探索--第一章:Activity的生命周期和启动模式 怀着无比崇敬的心情翻开了这本书,路漫漫其修远兮,程序人生,为自己加油! 一.序 作为这本书的第一章,主席还是把Activity搬上来了,也确实,和Activity打交道的次数基本上是最多的,而且他的内容和知识点也是很多的,非常值得我们优先把他掌握,Activity中文翻译过来就是"活动"的意思,但是主席觉得这样翻译有些生硬,直接翻译成"界面"可能更好,的确,Activity主要也是用于UI效

Android开发之Activity的生命周期

路漫漫其修远兮,吾将上下而求索.---屈原<离骚> 可能很多人会感觉Activity很简单,但是经历了半年的android开发,我发现我对Activity的的理解还是比较浅显的,其实Activity并没有我们想象的那么简单今天花了一个下午学习了Activity的生命周期,为以后忘记后迅速回顾,做准备. 一.首先看下官网给出activity的生命周期图 我们可以从图中分析它的执行过程: 1.启动Activity:系统会首先调用onCreate方法,然后调用onStart方法,最后调用onResu

【Android基础篇】Activity的生命周期

Google开发者文档 http://developer.android.com/reference/android/app/Activity.html 应用的每个页面都是一个Activity,这些Activity都存放在一个Activity栈中,每次进入某个应用或者应用的某个界面时,新界面这个Activity就压入到Activity栈的顶部:退出或返回的时候就把栈顶的Activity弹出,之前的Activity就又到了栈顶. Activity生命周期里的四个状态 - Running : Act

无废话Android之activity的生命周期、activity的启动模式、activity横竖屏切换的生命周期、开启新的activity获取他的返回值、利用广播实现ip拨号、短信接收广播、短信监听器(6)

1.activity的生命周期 这七个方法定义了Activity的完整生命周期.实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环: (1)Activity的完整生命周期 自第一次调用onCreate()开始,直到调用onDestory()为止.Activity在onCreate()中设置所有“全局”状态以完成初始化. 而在onDestory()中释放所有系统资源.例如,如果Activity有一个线程在后台运行从网络下载数据,它会在onCreate()创建线程, 而在onDestory()销

Android——Activity和Intent及Activity的生命周期

实验Activity的生命周期 package com.example.chenshuai.test; import android.app.Activity; import android.os.Bundle; import android.util.Log; /** * Created by chenshuai on 2016/3/16. */ public class Axtivity2 extends Activity { //回调方法 @Override protected void

android学习四(Activity的生命周期)

要学好活动(Activity),就必须要了解android中Activity的声明周期,灵活的使用生命周期,可以开发出更好的程序,在android中是使用任务来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈.栈的特性是后进先出,在默认的情况下,每当我们启动了一个新的活动,它会在返回栈中入栈,并处于栈顶的位置.而每当我们按下Back键或调用finish方法去销毁一个活动时,处于栈顶的活动会出栈,这时前一个入栈的活动就会重新处于栈顶的位置.系统总是会显示处于栈顶的活动给用户