activity

作者: junwu_123 | 来源:发表于2017-08-23 11:07 被阅读0次

    纯粹是个人学习总结,如有不对的地方请吐槽。

    Activity的简单介绍

    什么是Activity?
    activity是用户可与之交互的独立的可以聚焦的东西;它可以为用户提供的是一个简单的Window,用户可用于堆放自己想要的UI效果。

    Activity是一个线程或者进程吗?
    不是,Activity是存在于某个进程中,不是每一个activity都对应于一个新的进程,多个activity可以在同一个进程里面,甚至多个应用还可以在同一个进程里面;当然可以设置不同的LaunchMode让一个activity起来的时候创建一个进程,但它本身肯定不是线程或者进程,但它通常是这个进程的主角;

    Activity本身的执行逻辑是怎么样的?

    总结一下: Activity是Android提供的应用程序架构,它规定了一个应用运行的框架,它的生老病死;负责它的基础设施的创建和销毁,以及各个activity之间的切换,状态管理等; 有了这些规定,每个应用开发者,不需要关心进程的创建,不需关心主循环,比如你不会在apk包里面看到main函数,你也不会在apk包里面看到有关主循环的东西,你也不需要关心你的程序如何被暂停,如何被关闭等等,只需要按照它规定的接口写,就万事俱备;这些接口也很简单,也就是onCreate,onStart,onResume,onPause,onResume,onRestart,onStop,onDestory,这些接口也不是都需要实现的,

    Activity是Android应用程序组件,实现一个用户交互窗口,我们可以实现布局填充屏幕,也可以实现悬浮窗口。一个app由很多个Actvitiy组合而成,它们之间用intent-filter区别主次关系。

    activity子类:

    ListActivity、ActivityGroup、TabActivity、PreferenceActivity、FragmentActivity 、ListFragment、NativeActivity、ExpandableListActivity、LauncherActivity、AliasActivity、PreferenceFragment、ActivityUnitTestCase,AppCompatActivity

    activity父类:

    activity》ContextThemeWrapper》ContextWrapper》Context》Object

    Activity的四种状态

    Running状态:一个新的Activity启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态。

    Paused状态:当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,它仍然可见,但它已经失去了焦点,故不可与用户交互。

    Stopped状态:当Activity不可见时,Activity处于Stopped状态。当Activity处于此状态时,一定要保存当前数据和当前的UI状态,否则一旦Activity退出或关闭时,当前的数据和UI状态就丢失了。

    Killed状态:Activity被杀掉以后或者被启动以前,处于Killed状态。这是Activity已从Activity堆栈中移除,需要重新启动才可以显示和使用。

    4种状态中,Running状态和Paused状态是可见的,Stopped状态和Killed状态时不可见的。

    activity四种启动模式:

    简单说明(适用版):

    1. standard
    
        默认启动模式,每次激活Activity时都会创建Activity,并放入任务栈中,永远不会调用onNewIntent()。  
    
    2. singleTop
    
        如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,并调用其onNewIntent(),否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例,而不会调用onNewIntent(),此时就跟standard模式一样)。  
    
    3. singleTask
    
        如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中(此时不会调用onNewIntent())。   
    
    4. singleInstance
    
        在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。
    

    详细说明:

    standard模式:
    默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。

    singleTop模式:
    可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。
    若我意图打开的顺序为B1->B2->B2,则实际打开的顺序为B1->B2(后一次意图打开B2,实际只调用了前一个的onNewIntent方法)
    若我意图打开的顺序为B1->B2->B1->B2,则实际打开的顺序与意图的一致,为B1->B2->B1->B2。

    singleTask模式:
    只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
    如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,singleTask允许别的Activity与其在一个task中共存,也就是说,如果我在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的task中。

    singleInstance模式:
    只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。
    程序有三个ActivityD1,D2,D3,三个Activity可互相启动,其中D2为singleInstance模式。那么程序从D1开始运行,假设D1的taskId为200,那么从D1启动D2时,D2会新启动一个task,即D2与D1不在一个task中运行。假设D2的taskId为201,再从D2启动D3时,D3的taskId为200,也就是说它被压到了D1启动的任务栈中。

    若是在别的应用程序打开D2,假设Other的taskId为200,打开D2,D2会新建一个task运行,假设它的taskId为201,那么如果这时再从D2启动D1或者D3,则又会再创建一个task,因此,若操作步骤为other->D2->D1,这过程就涉及到了3个task了。

    相关文章

      网友评论

          本文标题:activity

          本文链接:https://www.haomeiwen.com/subject/nglddxtx.html