码迷,mamicode.com
首页 > 移动开发 > 详细

Android Activity生命周期及启动模式

时间:2018-09-15 00:35:40      阅读:256      评论:0      收藏:0      [点我收藏+]

标签:设备   layout   互相调用   conf   developer   技术分享   释放   android   组件   

  曾经搞过许多东西,再熟练的东西一段时间没有碰都会生疏或忘记。后来体会到写成文档记录下来的重要性,但有些word或ppt记录下来的东西随着时间流逝会丢失,或者不愿去看。或许保存成博客的形式,会是更好的选择,勉励自己。

  Activiy是Android开发中最常用最常见的组件,是Android开发人员开始学习首先接触的组件,也是大部分人建立一个工程后,首先要处理的可能就是Activity。这么重要、常用、简单、易上手的组件,牢固掌握其基础知识,对于开发人员是非常重要的。本文会首先解释其基本概念,对于其使用方式不做过多赘述,重点放在Activity的生命周期和启动模式上,附带讲解一些Activity管理的经验。

1 Activity的概念

   官方解释“An Activity is an application component that provides a screen with which users can interact in order to do something, such as dial the phone, take a photo, send an email, or view a map.”(https://developer.android.google.cn/reference/android/app/package-summary)中文含义是"Activity 是一个提供带屏交互应用程序的组件,例如拨打手机,拍照,发邮件,或看地图。"也就是说,Activity是屏幕交互View的容器,是用户通过屏幕操控程序的入口。

2 Activity的基本使用

   一般Activity和一个Layout布局文件配合使用。创建一个继承android.app.Activity的java类和一个放在"/res/layout"文件夹下的xml布局文件。然后在Activity的onCreate方法中,使用setContentView方法,制定layout的resourceID。这里不做展开。

3 Activity的生命周期

3.1Activity的运行状态

作为与用户交互位目的的组件。在启动后会有四种状态。

1,Active或者Running,是指Activity处于前端,获取了前台焦点的状态,此时Activity位于活动栈的栈顶。

2,paused,是指Activity处于可见状态,但是丧失了前台焦点。例如:被透明的Activity遮挡,设备转入休眠等。Android的通知栏不会导致Activity  进入paused状态。

3,stopped,当Activity对用户不可见时进入stopped状态,但此时仍保持已有的状态和成员信息,等等系统判断恢复运行状态,或者销毁。此时,如果系统内存不足,Activity占用的资源有可能被释放。

4,destroyed,Activity被系统回收,内存释放。此时Activity会从活动栈中移除。

  3.2 Activity的生命周期回调

    Android对Activity定义了7个生命周期的回调,对应Activity的创建和四种运行状态的切换。分别是:    

      • onCreate()
      • onStart()
      • onResume()
      • onPause()
      • onStop()
      • onDestroy()
      • onRestart()

     官网给出的生命周期回调流程图为:

技术分享图片

  结合上一部分解释的Activity的四种运行状态,我绘制了一个简单的生命周期流程图。如下:

 技术分享图片

  结合代码来看(相关代码会在本文最后作为附件给出)。Activity启动到绘制完毕,调用的生命周期为:

技术分享图片

如果此时按了home键,Activity进入后台,调用的生命周期为:

技术分享图片

再次唤醒Activity,调用的生命周期为:

技术分享图片

结束当前Activity,调用的生命周期为:

技术分享图片

 

    在启动Activity后,如果切换了屏幕方向,会导致当前Activity销毁并重绘。如果想取消屏幕切换时Activity的销毁重绘,对于Android3.2之前(不含),可以在manifest文件中设置当前Activity的android:configChanges=”orientation|keyboardHidden”,对于Android3.2及之后的sdk,可以设置android:configChanges=”orientation|keyboardHidden|screenSize“。详见博客https://blog.csdn.net/u014070729/article/details/50867646

4 Activity的启动模式

   Activity的启动模式有四种:standard.singleTop. SingleTask. singleInstance。如果不在配置文件中做任何设置,将以standard模式启动。

1,standard模式

  顾名思义,standard模式就是默认的标准启动模式。在这种模式下,每次启动当前Activity,就会在任务栈中创建一个当前Activity的实例。如果当前Activity多次连续启动,则按返回键时,也会依次唤起已经入栈的Activity实例,表现出退出多个当前Activity的现象。

2,singleTop模式

  singleTop模式与standard模式的唯一区别是:如果要求调用Activity时,如果当前任务栈的栈顶已经时当前Activity的实例,则不会重复创建。因此,不会再调用onCreate(),onStart(),onResume()的生命周期,但是可以调用onNewIntent()回调,我们可以再这里做一些数据处理。应用场景:注册,登录,避免多次点击产生bug。

3,singleTask模式

  使用singleTask模式,如果调用Activity时,当前任务栈的栈顶已经时该Activity的实例,则singleTask模式与singleTop模式一致。如果当前任务栈中没有Activity的实例,则会产生一个新的实例并置入栈顶。如果任务栈的下层有Activity的实例,则会把实例之上的所有其他Activity的实例全部出栈,使该Activity实例置于栈顶;表现上则是,该Activity第一次被调用后,调用的其他Activity,不能通过返回键返回到了。应用场景:适合作为程序入口点,例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面

4,singleInstance模式

  使用singleInstance模式,则会为当前Activity创建一个新的任务栈,并将产生的实例置入,其他Activity的实例不会置入。当在该实例下按返回键时,任务栈会销毁。由于涉及到任务栈的切换,所有这种模式下的切换市场和资源销毁比其他模式要大。这种模式一般应用与Activity与多个应用共享该Activity的情形,比如Launcher,从其他任何应用返回到Launcher,都可以保持是同一个单例。

5 Activity互相调用时的生命周期

   当Activity1中调用Activity2时,Activity1的实例首先会调用onPause回调。然后Activity2创建新的实例(或者依据启动模式不同,从栈内调起),依次调用onCreate(),onStart(),onResume()等回调,然后Activity1调用onStop()回调。如果Activity2是从栈内调起,则其依次调用onRestart(),onStart(),onResume()回调。如果Activity1需要出栈,则其在调用onStop()回调后会调用onDestroy()回调。

基本流程如图:

技术分享图片

结合代码来看,生命周期如下:

技术分享图片

6 总结

   本节总结了Activity的4中运行状态,基本生命周期,和启动模式。文中demo代码见附件。

https://files.cnblogs.com/files/acesui/ActivityDemo.rar

Android Activity生命周期及启动模式

标签:设备   layout   互相调用   conf   developer   技术分享   释放   android   组件   

原文地址:https://www.cnblogs.com/acesui/p/9643097.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!