您的位置:首页 > 移动开发 > Android开发

Android 基础知识总结---四大组件之一Activity(一)

2016-07-11 22:37 459 查看

一、Activity的生命周期

1、谈到Activity就避免不了说到他的生命周期,Activity的生命周期指一个Activity从创建到销毁所经历的阶段,期间会经历多个状态的变化,每次变化都会回调相应的方法,总共有七个回调方法,其中常用的就是前面四个回调方法:

1)onCreate()—->onStart()—>onResume()—>onPause()—>onStop()—>onRestart()—>onDestroy()

当Activity处于Android应用中运行时,它的活动状态由Android以Activity栈的形式管理。当前活动的Activity位于栈顶,随着不同应用的运行,每个Activity都有可能从活动状态转入非活动状态,也可能从非活动状态转入活动状态。所以又将Activity生命周期分为四种状态:

运行状态:可见,并且可操作,一般有(onCreate–onStart—onResume)或者 (onRestart–onStart—onResume)

暂停状态:可见,但是不可操作 onPause

停止状态:不可见,并且也不可操作 onStop

销毁状态:该Activity结束,或Activity所在的Dalivik进程被结束 onDestory

七个回调函数:

onCreate(): Activity在实例化过程被调用,进行创建工作,只会调用一次.一般创建界面时做一些数据的初始化工作。

onStart(): Activity启动过程的回调函数,使界面可见

onResume(): 恢复Activity时被回调,onStart()方法后一定会回调该方法,使界面变得可操作

onPause(): 暂停Activity时被回调(Activity失去操作焦点,但可见),系统会停止动画等消耗CPU的事情。

应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统收回。

在这里保存的数据,应该在onResume里读出来。

onStop(): 停止Activity时被回调(Activity失去操作焦点,而且不可见)

onDestory(): 销毁Activity时被回调,该方法只会被调用一次(回收资源) ,这是Activity被kill前最后一个被调用方法

2)Activity完整的生命周期

指从调用onCreate()创建Activity到最终调用onDestroy()销毁Activity的过程

onCreate()–>onStart()—>onResume()–>onPause()–>onStop()–>onDestory()

3)可见Activity的生命周期

指从调用onStart()/onRestart()开始到调用onStop()结束的过程

onStart()/onRestart()–>onResume()–>onPause–>onStop()

4)活跃Activity的生命周期

指从调用onResume()到调用onPause()暂停的过程

onResume()–>onPause()

2、Activity生命周期的几个过程,下面细说几个过程:

1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,这时Activity进入运行状态。

2.当前Activity被其他Activity覆盖其上或被锁屏时:系统会调用onPause方法,暂停当前Activity的执行。

3.当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。

4.当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,

然后调用onStop方法,进入停止状态。

5.这时当用户后退回到此Activity时:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。

6.当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:这时系统会再次调用onCreate、onStart、onResume 进入运行状态。

7.当用户退出当前的Activity:系统先调用onPause方法,然后调用onStop方法,

最后调用onDestory方法,结束当前Activity。

其中销毁Activity有以下几种情况:

1)点击回退按钮会销毁Activity。 触发onDestroy().

2)使用finish()手动销毁Activity。

3)处在暂停,停止状态下的Activity也有可能 被系统kill掉。导致Activity被销毁。

注意说明:

(开发Activity时也可根据需求选择性地覆盖指定方法,其中最常见的就是覆盖onCreate()方法,该方法用于对该Activity执行初始化。此外,覆盖onPause()方法也是很常见。比如用户正在玩一个游戏,此时有电话进来,就需要将当前游戏暂停,并保存该游戏的进行状态,接下来当用户再次切换到游戏状态时,onResume()方法已经被回调,因此可以重写该方法来回复游戏状态)。

但对于开发者来说Activity的创建和销毁都是透明的,开发者只能相应的去重写它的回调函数,然后在回调函数中编写自己的业务逻辑代码

3、同时我们还应该知道的是:Activity是Android应用的四大组件之一,另外三个分别是 Service,BroadcastReceiver,ContextProvider.

而Activity又是Android应用最常见的组件之一。Activity是应用程序的表现层,应用程序中的每个屏幕显示都通过继承和扩展基类Activity来实现的.

4、一个应用程序中可以包含多个Activity,它们之间可以相互跳转,来达到手机屏幕之间的相互切换。Activity利用View来实现应用程序的图形用户界面(GUI),而手机用户则直接通过GUI和应用程序进行交互,如应用程序通过GUI向用户显示信息,用户通过GUI向应用程序发出指令和响应

二、Activity的使用以及启动方式:

a)Activity使用的步骤:

(1)创建Activity,创建类继承Activity或其子类

(2)配置Activity 必须显式在Manifest配置文件中为其添加,并且为配置android:name属性,

值为.className

b)Activity的两种启动方式:

(1)通过startActivity(Intent intent)启动Activity。

传递参数的方式:调用intent的putExtra(“key”,values);Key-Value的方式,或者putExtras(Bundle);传递一个Bundle对象

获取参数的方式:调用intent的getXxxExtra(key)或者getExtras().getXxx()、注意:Xxx是数据类型

(2)通过startActivityForResult(Intent intent,int requestCode):该种方式主要是对于启动有返回结果的Activity

( 以指定的请求码启动Activity,而且程序将会等待新启动Activity的结果。一般情况下,我们只需要保证requestCode>-1即可,这样它都能收到result。但是如果在activity中,能够跳转到多个activiity,并且要接受到这多个activity中返回回来的信息的时候,我们就要注意了,这时候,requestCode就起大作用了,当你startActiviityForResult()的时候,会 给每一个不同的activity一个独立的requestcode,那么在你接受到result的时候就可以通过这个参数来判断当前的结果是哪个acitivity返回来的了)

注意:

*启动的Activity重写onActivityResult()方法来接收返回回来的结果,

而被启动的Activity设置返回数据调用setResult(int,Intent)来设置需要返回的数据*

那么setResult()方法在什么时候被调用呢?从源码可以看出,Activity返回result是在被finish的时候,也就是说调用setResult()方法必须在finish()之前。所以在onPause、onStop、onDestroy方法中调用setResult()也有可能不会返回成功,因为这些方法调用不一定是在finish之前的,当然在onCreate()就调用setResult肯定是在finish之前的,但是又不满足业务需要。

实际使用场景有两个:

(1)按BACK键从一个Activity退出来的,一按BACK、android系统就会自动调用Activity的finish()方法,

方法:重写onBackPressed()方法,捕获BACK事件,捕获到之后先调用setResult方法。代码如下:

@Override
public void onBackPressed()
{
Log.i(TAG, "onBackPressed");
setResult();
super.onBackPressed();
}


(2)在用户按点击事件中显式的去调用finish()方法,这样也能够保证结果能够返回

intent.putExtra("result",et.getText().toString());
setResult(RESULT_OK, intent);
finish();


三、关于Activity栈以及四种加载模式

Android系统中,所有的Activity被保存在Activity栈中,当启动一个新的Activity时,这个Activity就被压入Activity栈顶部,如果用户通过”返回”键回到上一个Activity的界面,那么栈顶的Activity将会被弹出,之前位于栈顶的第二个Activity就变成为新的栈顶Activity,并显示在屏幕上。所以当前显示在用户面前的Activity都是栈顶元素。

a)Activity四种加载模式,那么为什么要为Activity指定加载模式呢?

***Android对Activity的管理,采用Task来管理多个Activity,当我们启动一个应用时,Android就会为之创建了一个Task,然后启动这个应用的入口Activity,Android的Task是一个有点麻烦的概念,因为Android并没有为Task提供API,因此开发者无法真正访问Task,只能调用Activity的getTaskId()方法来获取它所在的Task的ID,事实上,我们可以把Task理解成Activity栈,Task以栈的方式来管理Activity,先启动的Activity被放在Task栈底,后启动的Activity被放在Task栈顶。那么Activity的加载模式,就负责管理实例化,加载Activity的方式,并可以控制Activity与Task之间的加载关系。

在配置Activity时可指定android:launchMode属性,该属性用于配置该Activity的加载模式,该属性持支如下4个属性值*

1)standard 默认的方式

不管当前Activity实例是否存在,都会创建一个新的实例装入Task。(通过这种模式来启动目标Activity时,每次android

系统都会为目标Activity创建一个新的实例,并将该Activity添加到目前的Task栈中,这种模式不会启动新的Task,启动的

新的Activity实例将被添加到原有的Task中)

例子:10个应用程序都要调用浏览器的应用,

那么你需要创建10个浏览器对象的Activity的对象吗?

2)singleTop 栈顶单例 —>微薄刷新

被跳转的Activity位于Task顶部时:不会创建新的实例,直接复用已有的Activity实例

被跳转的Activity不是位于顶部时:创建一个新的实例,同standard模式相似

3)singleTask 栈内单例:在同一个Task内只有一个实例

采用这种模式分三种情况:

a)如果将要启动的目标Activity不存在,系统将会创建目标Activity的实例,并将它加入Task栈顶。

b)如果将要启动的目标Activity已经位于Task栈顶,此时同singleTop模式

a)如果将要启动的目标Activity没有位于Task栈顶,系统将会把位于该Activity上面的所有Activity移除Task栈,从而使得

目标Activity转入栈顶。

4)singleInstance 全局单例模式

采用这种模式启动目标Activity时,可分为如下两种情况:

a)如果将要启动的目标Activity不存在,系统会先创建一个全新的Task,然后再创建目标Activity的实例,

并将它加入新的Task的栈顶。

b)如果将要启动的目标Activity已经存在,无论它位于哪个应用程序,哪个Task中,系统都会把该Activity所在的Task转

到前台,从而使用该Activity显示出来。但需要指出的是:采用单例模式加载的Activity总是位于Task栈顶,而且采用单

例模式加载的Activity所在Task只包含该Activity一个实例

最后附上Activity的生命周期图一张:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息