Android四大组件之Activity

来源:互联网 发布:淘宝服饰简介 编辑:程序博客网 时间:2024/06/07 08:45

     Activity这个组件作为Android的四大组件之一,必有其重要之处。Activity(活动)在应用中的表现形式其实就是一个用户界面。自然的,一个应用由若干个界面组成,也就是说我们的每一个应用其实就是由若干活动组成的。Activity会加载一个指定的布局文件来显示各种UI元素,例如:TextView、Button、ImageView等。并且每一个Activity为其加载的UI元素设置相应的事件处理函数来完成用户与UI元素之间的交互。此外,活动与活动之间可以进行跳转

 活动的注册

       我们所创建的所有活动都必须在AndroidManifest.xml中进行注册才能生效,这是必须的。在每个应用启动时会默认加载一个Activity(一般是我们启动应用就进入的那个Activity),这个Activity在AndroidManifest.xml中会被配置一个如下的intent-filter:

这样配置了这样一个intent-filter的活动就是我们这个应用的主活动了,当我们点击桌面上的的应用图标时首先打开的就是这个活动。


活动的生命周期

     1.onCreate()

     我们在创建继承自Activity的类时默认都会生成这个函数,它在活动第一次第一次被创建的时候调用,在这个函数中我们可以完成一些初始化操作,比如加载布局、绑定事件、初始化视图等。

      2.onStart()

     这个函数在onCreate()函数之后调用,此时Activity还是不可见的但是它的下一个状态Activity就是可见的了。也就是说这个函数在活动可见之前调用。

      3.onResume()

      这个函数在活动变为可见的时候被调用,执行完onResume()函数后,活动会请求AMS渲染它所管理的试图,此时活动位于返回栈的栈顶,并且处于可运行状态。

      4.onPause()

      这个函数通常在我们准备启动或恢复另一个活动时调用,此时活动由可见变为不可见,我们可以在这个函数中将一些消耗CPU的资源释放掉,以及保存一些关键数据。但是这个函数的执行一定要快,否则会影响新的栈顶活动的使用。

      5.onStop()

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

      6.onDestory()

      这个函数在活动变为销毁状态之前调用,之后的状态就变为了销毁状态。

      7.onRestart()

      这个函数在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。

Activity的四种启动模式

在我们学习启动模式之前我们先来了解以下回退栈。在上面的学习中我们已经知道一个应用程序是由多个Activity组成,那么Android 是如何来管理这些活动呢,其实Android内部通过使用回退栈来管理多个Activity实例。栈是一种后进先出的集合。当前正在运行的活动(也就是在设备上显示的)位于栈顶,当用户按下返回键时,栈顶的Activity出栈位于原栈顶下的Activity就自然成为了新的栈顶Activity显示在设备上。

   

       1、standard(标准启动模式)

       standard是活动的默认启动模式,这意味这对于所以的活动我们不手动指定的情况下默认都是standard模式的,在该模式下每当我们启动一个新的活动时该活动就会入栈,并处于栈顶。standard模式下系统不会关心在我们的回退栈中是否已经存在了该活动的实例,每次启动活动都会创建该活动新的实例,如图:

我们可以想象如过活动1是一个十分消耗系统资源的类那么采用这种模式可能会让我们的系统不堪重负。这就是Android系统为我们提供四种启动模式的原因,可以让我们根据程序的实际情况,选择合适的启动模式,那么接下来就让我们来学习下另外几种启动模式吧!

         2、singleTop

             如果以SingleTop模式启动的活动已经位于回退栈的栈顶时,这时如果再启动这个Activity不会创建新的实例而是复用原来的位于栈顶Activity实例,并会调用该实例的onNewIntent()函数将Intent对象传递到该实例,例如:如果一个ActivityA的启动模式为singleTop并且该活动已经位于回退栈的栈顶那么再调用startActivity()启动另一个活动ActivityA不会再创建新的实例,而是复用原先的。但是需要注意的是如果ActivityA并不是位于回退栈的栈顶,如果调用startActivity()启动ActivityA那么任然会创建一个新的实例并入栈如下图。

      3、singleTask

     如果一个活动的启动模式为singleTask那么在整个回退栈中都只能有一个该活动的实例,在启动该活动时,如果回退栈中还没有该活动的实例,那么会创建一个并将其放在栈顶,但是如果已经存在了这是要再启动该活动,不会再创建新的实例,而是将原实例上的所有活动出栈销毁,此时该活动自然就位于栈顶了,同时会回调该活动的onNewIntent()。


      4、singleInstance

         在这种模式下会有一个单独回退栈来管理这个活动,不管哪个应用程序来访问这个活动都是共用同一个回退栈,这样也解决了共享活动实例的问题。同样的,被该实例启动的其他活动会自动运行在另一个会退栈中,当再次启动该实例时,会重用已经存在的任务和实例。


备注:可以在AndroidManifest.xml中通过给<Activity>标签指定android:launchMode属性来选择启动模式。