Android四大组件之--Activity的深入浅出

Activity 在应用中的表现就是一个用户界面,它会加载指定的布局文件来显示各种UI元素,例如:TextView,Button,ImageView,ListView等,并且为这些UI元素设置事件处理函数,使得用户可以与这些UI进行交互。同时,Activity还可以在不同的Activity之间跳转,将不同的页面串联在一起,共同完成特定的操作流程。每个应用都是由一个或者多个Activity组成,它是Android应用程序不可缺少的部分。
应用启动时会加载一个默认的Activity,这个Activity在AndroidManifest.xml中会被设置为如下intent-filter
 <intent-filter>
 <action android:name="android.intent.action.MAIN" />
 <category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>

1.1 Activity的生命周期

每个Activity都有生命周期,在不同的阶段会回调不同的生命周期函数,Activity的生命周期有以下几个:

  1. onCreate(): 相信这是开发者见过的次数最多的函数,我们在创建继承自Activity的类时都会默认生成这个函数,它会被Activity第一次被创建时调用,通常会在这个函数中完成初始化操作,如:设置布局,初始化视图,绑定事件等。

  2. onStart(): 这个函数在Activity的onCreate函数调用之后被调用,此时的Activity还处在不可见状态,它的下一个状态就是Activity变得可见的时候,也就是这个函数在Activity可见之前被调用。

  3. onResume(): 这个函数在Activity变为可见时被调用,执行onResume之后,Activity就会请求AMS渲染它管理的视图,此时的Activity一定位于返回栈的栈顶,并且处于运行状态。

  4. onPause() :这个函数在系统准备去启动或者恢复另一个Activity时调用,也就是从可见状态变为不可见时。我们通常会在这个函数中将一些消耗CPU的资源释放掉,以及保存一些关键数据。

  5. onStop(): 这个函数在Activity完全不可见时调用。它和onPause函数的主要区别在于,如果新启动的Activity是一个对话框式的Activity,那么onPause函数会得到执行,而onStop函数并不会执行。

  6. onDestroy(): 这个函数在Activity被销毁之前调用,之后Activity的状态将变为销毁状态。

  7. onRestart(): 这个函数在Activity由停止状态重新变为运行状态之前调用,也就是Activity被重新启动了。

    从onCreate()函数到onDestroy()函数运行时期就是一个Activity的完整的生命周期。一般情况下。我们会在一个Activity的onCreate()函数中完成各种初始化操作,在onDestroy()函数中完成释放内存的操作。然而并不是各个时期Activity都是可见的,只有onResume()函数和onStop()函数之间的Activity是可见的,在Activity可见期内,用户可以与Activity进行交互,完成所需的功能。
    为了帮助读者能够更好的理解,Android官方提供了一个Activity生命周期的示意图,如下图所示:
    这里写图片描述

1.2 Activity的4种启动模式

每个应用程序都是由一个或者多个Activity组成,因此,Android内部使用通过回退栈来管理Activity实例。栈是一种后进先出的集合,对于Android来说,当前显示的Activity就在栈顶,当用户点击后退键或者点击应用上的返回按钮,系统就会将栈顶的Activity出栈,此时原来栈顶下的Activity就会变为栈顶显示到设备上。
然而事情可能并不是那么简单,在一些特殊情况下我们可能需要对Activity实例做一些特殊处理,例如:为了避免重复创建Activity,我们要求一个Activity只能有一个实例。好在Android系统为我们提供了这些功能。也就是我们接下来要说的Activity的四种启动模式。用户可以在AndroidMainfext.xml注册Activity时设置它的启动模式,例如:
<activity
    android:name=".MainActivity"
    android:launchMode="singleTask"
    android:label="@string/app_name"
</activity>

Activity的启动模式有4个,分别是standard,singleTop,singleTask,singleInstance
下面我们一一介绍。

1)standard(标准启动模式)
这是Activity的标准启动模式,也是Activity的默认启动模式。在这种模式下启动的Activity可以被多次实例化,即在同一个任务栈中可以存在多个Activity实例,每个实例都会处理一个Intent对象。如果ActivityA的启动模式为standard,并且已经有一个ActivityA被启动,在该ActivityA中调用startActivity时会启动一个新的ActivityA实例。栈的变化如下:

栈中有多个ActivityA的实例
如果ActivityA是一个非常耗资源的类,那么将会使它所依附的应用消耗更多的系统资源。

2)singleTop
如果一个以singleTop模式启动的Activity的实例已经存在于任务栈的栈顶,那么再启动这个Activity时,不会创建新的实例,而是重用位于栈顶的那个实例,并且会调该实例的onNewIntent()函数将Intent对象传递到这个实例中。例如ActivityA的启动模式为singleTop,并且ActivityA的一个实例已经存在于栈顶中,那么再调用startActivity启动另一个ActivityA时,不会再次创建ActivityA的实例,而是重用原来的实例,并且调用原来实例的onNewIntent()函数。此时任务栈中还是这一个ActivityA的实例,栈内变化如下图所示:

这里写图片描述

如果以singleTop模式启动的Activity的一个实例已经存在在任务栈中,但是不在栈顶,那么它的行为和standard模式相同也会创建一个新的实例。栈内变化如下图所示:
这里写图片描述

3)singleTask
singleTask模式是常用的启动模式,如果一个Activity设置为该启动模式,那么在一个任务栈只能有一个该Activity的实例。如果任务栈中还没有该Activity,会新创建一个实例并放在栈顶。但是,如果已经存在Activity,系统会销毁处在该Activity上的所有Activity,最终让该Activity实例处于栈顶。最终让该Activity实例处于栈顶,同时回调Activity的onNewIntent()函数,栈内变化如下图所示:

这里写图片描述
4)singleInstance
设置了singleInstance模式的Activity会在一个独立的任务中开启,并且这个新的任务中有且只有一个实例,也就是说被该实例启动的其他Activity会自动运行于另一个任务中。当再次启动该Activity实例时,会重用已存在的任务和实例。并且会调用该实例的onNewIntent()函数,将Intent实例传递到该实例中。
和singleTask不同的是,同一时刻在系统中只会存在一个这样的Activity实例,而singleTask模式的Activity是可以有多个实例的,只要这些Activity在不同的任务栈当中即可。singleInstance的Activity独占一个任务栈。

这里写图片描述

作者:May

作者:刘小梅:原文地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值