扣丁学堂——Activity(一)

扣丁课程Activity部分【源码下载】(对象传递)

一丶Activity由来

activity继承自ApplicationContext,并定义了一些方法如下

public class Activity extends ApplicationContext {

         protected void onCreate(Bundle savedInstanceState);

         protected void onStart();

         protected void OnRestart();

         protected void onResume();

         protected void onPause();

         protected void onStop();

         protected void onDestroy();

}

二丶方法与生命周期

扣丁学堂——Activity(一)_第1张图片

1、onCreate函数:如右图当Activity首次被加载或者Activity被销毁后(onStop后),便会调用onCreate函数。主要是做一些初始化的工作,如通过findViewById获取对应的控件和相应的监听事件。

2、onStart函数:执行完onCreate函数后,接下俩便是onStart函数的调用;还有一种情况就是当activity已经被执行了onStop函数后(窗体和进程没有被销毁),会调用onRestart和onStart函数,进入可视状态。

3onResume函数:这个函数就是就是将activity位于栈顶,用户便可以与之交互,对界面进行操作了,进入可操作状态。

4onPause函数:当调用另外一个activity或者当前的activity失去焦点的时候调用onpause函数。当前的activity依然可见,但是不能对其进行操作,进入不可操作但是可视状态,可回收。

5onstop函数:当前的activity如果完全不可见了,便会调用onstop函数,进入不可视状态,可回收。

6onDestroy函数:当activity被系统回收掉或者主动finish掉,便会调用ondestroy进行销毁。

三丶Activity的三种基本状态

1、激活状态或者可操作状态:在这个状态下activity呈现在用户面前,用户可以对它进行操作,比如点击按钮等等。
2、暂停状态:这个时候activity依然可见,但是失去了焦点。如应用程序退出的时候弹出那个提示框(焦点所在),activity的界面做了背景(不能操作)。
3、停止状态:这是活动完全被其他的activity遮盖,用户不可见了。但它任然保留所有的状态和成员信息。

注意:在暂停和停止状态的时候,当内存非常低的时候可能会将这个activity杀掉。

四丶对activity四种情况下的响应流程(可能面试题)

1、返回键:进入activity  onCreate->onStart->onResume ->按了返回键->onPause->onStop->onDestroy.

2、启动程序进入activity,按home键进入桌面,然后长按home键点击该activity重新进入这个activity

onCreate->onStart->onResume->按了home->onPause->onStop->重新进入activity->onRestart->onStart->onResume.

3、启动程序,进入activity,然后按挂机键,进入锁屏,然后按挂机键重新进入activity

onCreate->onStart->onResume ->按了挂机键->onPause->按了挂机键->onResume.  

4、两个activity ABB采用dialog来作为界面,属性如下:android:style/ Theme.DialogA跳转到B,再从B跳转到A。流程如下:

onCreate->onStart->onResume ->进入activity2->onPause->退回到activity1->onResume.

5、打开程序,启动activity,点击按钮弹出alertDialog对话框,按返回键。

onCreate->onStart->onResume---------alertDialogactivity本身的一部分,对activity的生命周期没有影响。

6、当activity处于可回收状态时(onpauseonstop),系统由于内存不足,系统杀死该activity

转换图增强理解

扣丁学堂——Activity(一)_第2张图片

Android为我们定义了四种加载模式

Android为我们定义了四种加载模式,分别是:standard、singleTop、singleTask和singleInstance。

1、standard模式:

这个模式也是Android 系统默认的模式,新产生的activity不管是自己还是别人,都会新建一个activity的实例,并把自己放到最上面的过程。用碗的概念来解释就是不管洗到什么碗都忘这个碗栈上面添加,不管是相同的碗还是说不相同的碗。(1->2  :表示1启动2)

比如activityA -> activityB -> activityC -> activityD -> activityE(A,B,C,D,E可以相同也可以不同)最后产生的task结果为:

E
D
C
B
A

2、singleTop模式
这个模式就是被启动的activity如何和当前位于栈顶的activity相同的话,它不会产生实例而是会调用onNewIntent()函数。如果被启动的activity不和当前位于栈顶的activity相同,便会产生新的activity的实例并将其位于栈顶。拿洗碗的例子来说就是,当放一个新碗放这个碗栈的时候,先看下当前碗栈最上面的那个是不是和这个新碗一样,是的话就不放进去(调用onNewIntent函数),如果不是的话就把新碗放在碗栈的栈顶。
举个例子:
activityA->activityB->activityC->activityC:

让我们来分析过程:activityA->activityB:因为B与A不同,产生栈AB

activityA->activityB->activityC:因为C与B不同,产生栈ABC
activityA->activityB->activityC->activityC:因为C与C相同,C调用一次onNewIntent函数,产生栈ABC

3、singleTask模式:
这个模式要分两种情况来分析。
(1)当在同一个应用程序中调用activity的时候(activityB申明为singleTask模式):
activityA->activityB->activityC->activityD->activityB:
下面来分析:A、activityA->activityB     得到的栈为 AB;按返回键:B->A
B、activityA->activityB->activityC   得到的栈为ABC;按返回键:C->B->A
C、activityA->activityB->activityC->activityD 得到的栈为ABCD;按返回键:D->C->B->A
D、activityA->activityB->activityC->activityD->activityB      得到的栈为AB(当task中已经有了B的时候,就会把B上面的实例(C,D)都销毁掉,把自己露出来)按返回键:B->A
(2)当别的程序调用了这个activity的时候(activityB申明为singleTask模式:)
activityA(第一个应用程序task9)->activityB(第二个应用程序:task10)->activityC(第二个应用程序:task10)->activityB(第二个应用程序:task10)->退回home->重新进入第一个应用程序(activityB消失,进入的是activityA)
下面来分析:
第一步:activityA(第一个应用程序task9)->activityB(第二个应用程序:task10) activityB产生新的task,并将B放入task10中;按返回键:B->A
第二步:activityA(第一个应用程序task9)->activityB(第二个应用程序:task10)->activityC(第二个应用程序:task10) 将activityC压入task10中;按返回键:C->B-A
第三步:activityA(第一个应用程序task9)->activityB(第二个应用程序:task10)->activityC(第二个应用程序:task10)->activityB(第二个应用程序:task10):销毁在task10中的activityC,显示task10中activityB;按返回键:B->A
第四步:activityA(第一个应用程序task9)->activityB(第二个应用程序:task10)->activityC(第二个应用程序:task10)->activityB(第二个应用程序:task10)->退回home->重新进入第一个应用程序(activityB消失,进入的是activityA)
再次进入第一个应用程序的时候,activityA已经不见了,直接显示task9中的activityA。按返回键:A->NULL

4、singleInstance模式:
这个模式就是将对应的activity单独放在一个task中,当被调用的时候如果没有该实例便新建一个放进新的task中,如果在task中有这个实例就直接取出来调用onNewIntent函数。
这个模式要分两种情况来分析。
(1)当在同一个应用程序中调用activity的时候(activityB申明为singleInstance模式):
activityA(task 9)->activityB(task10)->activityC(task9)->activityD(task9)->activityB(task10):
下面来进行分析:
第一步:activityA->activityB:activityB产生新的task10,并将activityB压入栈;按返回键:B->A
第二步:activityA(task 9)->activityB(task10)->activityC(task9):产生activityC,但是不压入task10,而是放入task9;按返回键:C->B->A
第三步:activityA(task 9)->activityB(task10)->activityC(task9)->activityD(task9):产生activityD,放入task9;按返回键:D->C->B->A
第四步:activityA(task 9)->activityB(task10)->activityC(task9)->activityD(task9)->activityB(task10):将task10中的那个activityB调出来,不产生新的activityB,同时还调用onNewIntent函数。按返回键:B->D->C->A
(2)当别的程序调用了这个activity的时候(activityB申明为singleInstance模式:)
activityA(第一个应用程序task9)->activityB(第二个应用程序:task10)->activityC(第二个应用程序:task11)->activityD(第二个应用程序:task11)-,>activityB(调用onnNewIntent函数)。返回键:B->D->C->A

下面总结一下:

“拿来主义”standard模式。哪里需要调用我我就去哪里,可以多次实例化,可以几个相同的Activity重叠。
“拒绝堆叠”singleTop模式。可以多次实例化,但是不可以多个相同的Activity重叠,当堆栈的顶部为相同的Activity时,会调用onNewIntent函数。
  “独立门户”singleTask模式。同一个应用中调用该Activity时,如果该Activity没有被实例化,会在本应用程序的Task内实例化,如果已经实例化,会将Task中其上的Activity销毁后,调用onNewIntent;其它应用程序调用该Activity时,如果该Activity没有被实例化,会创建新的Task并实例化后入栈,如果已经实例化,会销毁其上的Activity,并调用onNewIntent。一句话,singleTask就是“独立门户”,在自己的Task里,并且启动时不允许其他Activity凌驾于自己之上。
“孤独寂寞”singleInstance模式。加载该Activity时如果没有实例化,他会创建新的Task后,实例化入栈,如果已经存在,直接调用onNewIntent,该Activity的Task中不允许启动其它的Activity,任何从该Activity启动的其他Activity都将被放到其他task中,先检查是否有本应用的task,没有的话就创建

本文先叙述到这里,本节只是对Activity理解做概述,下一届再从功能上介绍:谢谢浏览,你的支持是我前进的动力


你可能感兴趣的:(源码,Activity,扣丁学堂)