Activity深入解析

来源:互联网 发布:js实现查看图片大图 编辑:程序博客网 时间:2024/04/29 19:03

Activity深入解析

  1. Activity简介

        ActivityAndroid的四大组件之一。是应用程序的表示层,程序的流程都运行在Activity之中,在Android的程序当中,Activity一般代表手机屏幕的一屏。Activity本身是没有界面的,通过setContentViewview)接口把UI放到Activity创建的窗口上。多个Activity之间可以发生相互跳转,Activity之间的跳转有可能有返回值。

  2. Activity的生命周期

       

    每一个Activity都处于某一个状态,开发人员无法控制其应用程序处于某一个状态,这些状态由系统控制。当一个活动的状态发生改变时,可以通过调用onxxx()的方法,获得相关的通知信息。

    启动Activity时,依次执行onCreate(),onStaet(),onResume()然后进入Activity的活动状态。结束Activity时,依次执行onPause(),onStop(),onDestory(),然后Activitykille

    onCreate:在这里创建界面,做一些数据的初始化工作。

    onStart:此时成为“用户可见不可交互”状态。

    onResume:此时用户可交互,(在Activity栈系统中,当前Activity运行在栈顶位置,运行完后出栈,上一个Activity运行在栈顶)。

    onPause:可见不可交互,应该在此处保存需要的数据,并且应该咋reResume里读出来。

    onStop:不可见,被下一个Activity覆盖。

    onDestroy:可能是程序自然销毁,或是其他类调用finish方法或系统为节省资源将它暂时性的关闭,可以使用isFinishing()来判断。

    Activity由活动状态转为暂停状态时,它依然与窗口管理器保持连接,系统继续维护其内部状态,它仍旧可见,但已经失去了焦点,不再与用户交互。在极其特殊的情况下,Androidkill一个暂停的Avtivity,以保证充足的资源。当Activity变为被停止,变为完全隐藏时,它失去焦点,并且不可见。但系统仍然在内存中保存它所有的状态和信息。最后,Activity被杀死,转为销毁状态,Activity彻底结束,并从内存中消失。

          

          

          Activity状态的保存和恢复:

  1. Activity之间的跳转

        Activity中满足触发条件,通过使用意图Intent即可实现Activity的跳转。要想成功跳转Activity,必须在Manifest.xml中注册新的Activity

          使用Intent实现跳转的常见方法:

            跳转到另一个Activity

               Intent -> setClass(self.this,aim.class)-> startActivity(intent) -> finish()

      当使用finish()时,则会停止当前的Activity

               Intent -> setComponent() ->startActivity(intent)

 

  1. Activity之间的通信

    Android中,不同的 Activity实例可能运行在一个进程中,也可能运行在不同的进程中。因此需要一种特别的机制帮助我们在 Activity之间传递消息。Android中通过 Intent对象来表示一条消息,一个 Intent对象不仅包含有这个消息的目的地,还可以包含消息的内容。对于一个 Intent对象,“目的地”是必须的,而内容则是可选项。

    Intent负责对操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。

    Intent对象绑定数据:使用Bundle存储要传递的数据元素,在Intent中使用putExtras(),最后将startActivityintent);从目标Activity返回值时,要使用startActivityForResult,需要将Intent声明为final,最后将IntentsetResult()的方法返回。

     

  2. Activity的栈式管理

    Android针对Activity的管理使用的是栈,就是说某一个时刻只有一个Activity处在栈顶,当这个Activity被销毁后,下面的Activity才有可能浮到栈顶,或者有一个新的Activity被创建出来,则旧的Activity就被压栈沉下去了。ActivityAndroid程序的表现层。程序的每一个显示屏幕就是一个Activity。正在运行的Activity处在栈的最顶端,它是运行状态的。

    当在程序中调用 Activity.finish()方法时,结果和用户按下 BACK键一样:它告诉 Activity ManagerActivity实例可以被“回收”。随后 Activity Manager 激活处于栈第二层的 Activity,把原 Activity压入到栈的第二层,从 Running状态转到 Paused状态。

     

  3. Activity的启动模式

    Actvity的启动模式在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity实例公用一个task里。

    task是一个具有栈结构的对象,一个task可以管理多个Activity,启动一个应用,也就创建一个与之对应的task

    Activity一共有四种启动模式:standardsingleTopsingleTasksingleInstance。一般要在Manifestactivity标签中指定活动的启动模式。

    standardstandard模式是默认的启动模式,不用为<activity>配置android:launchMode属性即可,也可以指定为standard模式。在standard模式下,每次的活动跳转都会在task中生成一个新的活动实例,并将其放在栈结构的顶部,不管有没有已存在的实例,都会产生新的实例(包括发起跳转的活动本身)。

    singleTop:在<activity>下指定活动的属性为android:launchMode=“singleTop”,系统则会以singleTop模式处理跳转行为。跳转时系统会在栈结构中判断栈顶实例是否就是要跳转的实例,如果是则直接使用这个实例,而不会重新创建。如果栈中不存在要跳转到的实例或要跳转到的实例不在栈的顶部,系统会重新生成一个实例。

    singleTask:在<activity>下指定活动的属性为android:launchMode=“singleTask”。跳转时系统会在整个栈结构中寻找要跳转到的InstanceA,如果没找到则重新创建,如果找到则将InstanceA之上的所有Instance出栈,使InstanceA处于栈顶位置。出栈的Instance则不再包含在这个栈中。

    singleInstance:设置为singleInstance模式后,它会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入。启动这个应用的入口Activity,那在它的界面上调用其他的Activity也只是在这个task里面。那如果在多个task中共享一个Activity的话怎么办呢。举个例来说,如果开启一个导游服务类的应用程序,里面有个Activity是开启GOOGLE地图的,当按下home键退回到主菜单又启动GOOGLE地图的应用时,显示的就是刚才的地图,实际上是同一个Activity,实际上这就引入了singleInstancesingleInstance模式就是将该Activity单独放入一个栈中,这样这个栈中只有这一个Activity,不同应用的intent都由这个Activity接收和展示,这样就做到了共享。

 

 

0 0
原创粉丝点击