Activity基本介绍

来源:互联网 发布:vmware esxi mac os 编辑:程序博客网 时间:2024/06/07 02:56

Android各种基本知识笔记-Activity


Activity生命周期

  • onCreate():

    活动第一次被创建的时候调用,在这里我们应该完成那些刚启动活动就必须完成的初始化操作,比如说加载布局、绑定各种事件等等。

  • onStart():

    在活动由不可见变为可见的时候调用。

  • onResume():

    在活动准备好和用户进行交互的时候调用,这时的活动一定位于返回栈的栈顶,并且处于运行状态。

  • onPause():

    在系统准备去启动或回复另一个活动的时候调用,这里通常会将一些消耗CPU的资源释放掉,还有保存一些关键数据,但是这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用,也就是说在这里不能进行什么耗时的操作。

  • onStop():

    在活动完全看不到的时候调用。

  • onDestory():

    在销毁活动的时候调用。

  • onRestart():

    在活动由停止状态变为运行状态之前(即重启活动)调用。

活动生命周期表

Activity启动模式

设置Activity的启动模式,只需要在AndroidManifest.xml里对应的< activity>标签设置android:launchMode属性

例如

<activity  android:name=".MainActivity"android:launchMode="standard" />
  • standard

    这是默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。
    例如:
    我有一个Activity名为A1,注册一个按钮可跳转到A1(即自己)。那么如果我点击按钮,便会新启一个Activity A1叠在刚才的A1之上,再点击,又会再新启一个在它之上。点back键会依照栈顺序依次退出,但之前开了几个Activity就必须退出多少次才能完全退出。

  • singleTop

    如果某个Activity自己激活自己,那么任务栈栈顶就是该Activity,则不需要创建,其余情况都要创建Activity实例
    例如:
    我有两个Activity名为B1,B2,两个Activity内容功能完全相同,其页面上都有两个按钮可以跳到B1或者B2,唯一不同的是B1为standard,B2为singleTop。
    若我意图打开的顺序为B1->B2->B2,则实际打开的顺序为B1->B2(后一次意图打开B2,实际只调用了前一个的onNewIntent方法)
    若我意图打开的顺序为B1->B2->B1->B2,则实际打开的顺序与意图的一致,为B1->B2->B1->B2

  • singleTask

    如果要激活的那个Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶,并把该Activity以上的Activity实例都pop出来
    例如:
    创建了三个Activity C1、C2、C3,其中C1是singleTask模式,那么如下启动顺序的结果为:

启动顺序: C1、C2、C3、C2、C1 C2、C1、C2、C3 实际启动: C1 C2、C1
  • singleInstance

这种启动模式比较特殊,因为它会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入。
其实这样做的意义在于:当程序中有一个活动是允许其他程序调用的,如果我们想实现其他程序和我们的程序可以共享这个活动的实例,因为每个应用程序都会有自己的返回栈,同一个活动在不同的返回栈中入栈时必然是创建了新的实例,所以使用前三种启动模式肯定完成不了这个任务。而使用singleInstance模式,它这种模式下面会有一个单独的返回栈来管理这个活动,不管哪个程序访问这个活动都只能公用同一个返回栈,这也就解决了共享活动实例的问题了。
例如:
程序有三个ActivityD1,D2,D3,三个Activity可互相启动,其中D2为singleInstance模式。那么程序从D1开始运行,假设D1的taskId为1,那么从D1启动D2时,D2会新启动一个task,即D2与D1不在一个task中运行。假设D2的taskId为2,再从D2启动D3时,D3的taskId为1,也就是说它被压到了D1启动的任务栈中。
若是在别的应用程序打开D2,假设Other的taskId为1,打开D2,D2会新建一个task运行,假设它的taskId为2,那么如果这时再从D2启动D1或者D3,则又会再创建一个task,因此,若操作步骤为other->D2->D1,这过程就涉及到了3个task了。

0 0