当前位置:天才代写 > tutorial > 安卓教程 > Android Activity的生命周期简单总结

Android Activity的生命周期简单总结

2021-02-24 12:30 星期三 所属: 安卓教程 浏览:20

Android Activity的生命期简易小结

这儿的內容参照官方网的文本文档,本文的目地并不是去小结Activity是如何启动,怎样造就,及其中止和消毁的,只是从具体开发设计中剖析在Activity每个生命期,大家应当解决的內容。

Activity 每个生命期

谷歌官方图片

由图能够看得出 ,在一个activity的生命期中,系统软件会像金字塔模型一样去启用一系列的生命期回调函数。在最上方是当今Activity的运作情况,换句话说客户完全见到这一Activity时,Activity正处在onResume()情况。并且带图能看出去存有很长期的情况仅有三个,Resume , PausedStoped 别的好多个情况存有的時间较为短暂性,迅速便会进到别的情况。而Create方式做为建立Activity时启用的方式,也是极其重要的回调函数方式。下边大家关键考虑到这一四个方式的回调函数机会,并考虑到在这其中应当填写的作用。

onCreate

运行一个Activity,Android一般有2种方法,即根据点一下主界面的桌面图标运行Activity与在别的Activty选用startActivity这类的方式运行新的Activity.但无论哪一种方法,建立新的Activity时都是会启用onCreate()方式。大家务必来完成程序流程运行所必须的各种各样基础逻辑性。例如申明UI原素,界定成员函数,配备UI这些。
留意在onCreate里边尽量避免做事情,防止程序流程运行很久看不见页面。由于onCreate实行完了以后,客户并不可以见到页面,直至经历了onStart以后启用onResume进到Resume情况,这时候才算是客户见到的页面,因此 怎样onCreate中做的事儿过多,则程序流程会运行的较为久。一般新创建一个Activity会自动生成onCreate,其编码以下:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);
}

这儿我们可以见到onCreate回调函数方式中传到的主要参数是Bundle种类的savedInstanceState。它是主要参数是用于储存Activity和修复Activity的。当Activity是由于客户点一下Back按键或是是activity根据启用finish()完毕自身时,系统软件就遗失了对Activity案例的引入,由于这一个人行为代表着不会再必须这一activity了。殊不知,假如由于服务器资源焦虑不安而造成Activity的Destory, 系统软件会在客户返回这一Activity时有这一Activity存有过的纪录,系统软件会应用这些储存的纪录数据信息(叙述了当Activity被Destory时的情况)来再次建立一个新的Activity案例。这些被系统软件用于修复以前情况而储存的数据信息被称为 "instance state" ,它是一些储放在Bundle目标中的key-value pairs。它是官方网对instance state的表述。一般,我们可以无需管它,由于他会全自动储存每一个View主视图的信息内容,随后当修复的情况下,会全自动修复到以前的情况。但大家有时也会使他储存一些大家期待他储存的物品,例如纪录客户情况的成员函数信息内容,这时候大家必须采用onSavaInstacneState()方式,当客户离去Activity时,系统软件会启用它。当系统进程这一涵数时,系统软件会在Activity被出现异常Destory时传送 Bundle 目标,那样大家就可以提升附加的信息内容到Bundle中并储存到系统软件中。若系统软件在Activity被Destory以后想再次建立这一Activity案例时,以前的Bundle目标会(系统软件)被传送到你大家activity的onRestoreInstanceState()方式与 onCreate() 方式中。

为了更好地给Activity储存附加的情况信息内容,你务必完成onSaveInstanceState() 并提升key-value pairs到 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的情况下,大家先分辨一下情况下是第一次建立還是修复以前被Destory的Activity,能够参照下边的事例,在onCreate方式里恢复数据库

@Override
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);
}

onPause

Paused情况是一个始终保持的静态数据情况,Activity有时会被别的由此可见的部件堵塞,进而造成当今的activity进到Pause情况。比如当开启一个提示框的情况下,以前的 Activity会被中止,但只需以前的Activity依然被一部分由此可见,这一activity便会会一直处在Paused情况。殊不知,一旦以前的activity被彻底堵塞并不由此可见时,则其会进到Stop情况.activity一旦进到paused情况,系统软件便会启用activity中的onPause()方式, 该方式中能够终止不应该在中止全过程中实行的实际操作,如中止视频在线观看;或是储存这些有可能必须长期性储存的信息内容。假如客户从脱机工作返回当今activity,系统软件应当修复这些数据信息并实行onResume()方式。
一般 在onPause()回调函数方式中做下列事儿

终止动漫或是是别的已经运作的实际操作,这些都是会造成CPU的消耗.
递交在客户离去阶段待储存的內容(比如电子邮件文稿).
释放出来服务器资源,比如broadcast receivers, sensors (例如GPS), 或是是别的一切会危害到用电量的資源。

比如, 假如程序流程应用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()来实行CPU-intensive 的工作中,比如写数据信息到DB,因为它会造成转换到下一个activity越来越迟缓。

onResume

当客户从Paused情况修复activity时,系统软件会启用onResume()方式。一定要注意,系统软件每一次启用这一方式时,activity都处在前台接待,包含第一次建立的情况下。因此 ,应当完成onResume()来复位这些在onPause方式里边释放出来掉的部件,并实行这些activity每一次进到Resumed state都必须的复位姿势 (比如逐渐动漫与复位这些仅有在获得客户聚焦点时才必须的部件)
下边的onResume()的事例是与上边的onPause()事例相对性应的。

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

onStop

在下面一些重要的情景中会牵涉到终止与重新启动:

客户开启最近使用app的莱单并从大家的app转换到此外一个app,这个时候大家的app是被终止的。假如客户根据手机上主界面的运行程序图标或是最近使用程序流程的对话框返回大家的app,那麼大家的activity会重新启动。

客户在大家的app里边实行运行一个新activity的实际操作,当今activity会在第二个activity被建立后stop。假如客户点一下back按键,第一个activtiy会被重新启动。

客户在应用大家的app时接受到一个拨电话语音通话.

Activity类出示了onStop()onRestart()方式来容许在activity终止与重新启动时开展启用。有别于脱机工作的一部分堵塞UI,终止情况是UI不会再由此可见而且客户的聚焦点迁移到另一个activity中.

onStop 方式activity不会再由此可见,而且应当释放出来这些不会再必须的全部資源。一旦activity终止了,系统软件会在必须存储空间时催毁它的案例(和栈构造相关,一般 back实际操作会造成前一个activity被消毁)。极端化状况下,系统软件会立即杀掉大家的app过程,并不实行activity的onDestroy()回调函数方式, 因而大家必须应用onStop()来释放出来資源,进而防止内存泄漏。
上边大家早已讲了在onPause()中我们都是不建议开展数据库查询读写能力等实际操作的,而应当把它放进onStop()中,让该方式来实行一些CPU聚集的实际操作。
就好似onResume方式里来复位被onPause方式中关掉的資源,大家也应当在onStart方式里来复位在onStop方式里关掉的資源。
当系统软件Destory大家的activity,它会为activity启用onDestroy()方式。由于大家会在onStop方式里边做释放出来資源的实际操作,那麼onDestory方式则是大家最终去消除这些很有可能造成内存泄漏的地区。因而必须保证这些进程都被destroyed而且全部的实际操作都被终止。

到此,Activity生命期中,大家应当做的工作中就描述结束了。

PS 这儿许多內容全是官方网文本文档和管理方法Activity的生命期中的內容,这篇博闻关键用于知识梳理。

 

    关键字:

天才代写-代写联系方式