您的位置:首页 > 其它

扣丁学堂——Activity(一)

2015-12-03 20:42 357 查看
扣丁课程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();

}
二丶方法与生命周期




1、onCreate函数:如右图当Activity首次被加载或者Activity被销毁后(onStop后),便会调用onCreate函数。主要是做一些初始化的工作,如通过findViewById获取对应的控件和相应的监听事件。
2、onStart函数:执行完onCreate函数后,接下俩便是onStart函数的调用;还有一种情况就是当activity已经被执行了onStop函数后(窗体和进程没有被销毁),会调用onRestart和onStart函数,进入可视状态。
3、onResume函数:这个函数就是就是将activity位于栈顶,用户便可以与之交互,对界面进行操作了,进入可操作状态。
4、onPause函数:当调用另外一个activity或者当前的activity失去焦点的时候调用onpause函数。当前的activity依然可见,但是不能对其进行操作,进入不可操作但是可视状态,可回收。
5、onstop函数:当前的activity如果完全不可见了,便会调用onstop函数,进入不可视状态,可回收。
6、onDestroy函数:当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 A和B,B采用dialog来作为界面,属性如下:android:style/
Theme.Dialog,A跳转到B,再从B跳转到A。流程如下:

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

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

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

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

转换图增强理解



丶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理解做概述,下一届再从功能上介绍:谢谢浏览,你的支持是我前进的动力
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: