首页 > 代码库 > Android中Activity完全解析

Android中Activity完全解析

Activity的生命周期

1.Activity几种状态

1、Active(活动):当Activity位于栈顶时,它是可见,有焦点的前台Activity,可以用来响应用户的输入。

2、Paused(暂停):一般情况,你的Activity可见但不具有焦点,例如 当前面的Activity是全透明或非透明的Activity时,下面的Activity就位于Paused状态。

3、Stopped(停止):当一个Activity彻底不可见时,就处于这个状态。此时Activity完全不可见,但在内存中仍旧保留该Activity的状态和成员信息。

4、Inactive(销毁):当一个Activity被杀死时,就变成Inactive。Inactive Activity会从Activity栈中移除,如果重新显示需要重新启动。一般销毁由系统Dalvik控制。

8468031

 

2、Activity生命周期每个函数的解析

1、onCreate(Bundle saveInstanceState)

该函数是该Activity第一次启动时调用,且启动后就不在执行,除非由于系统内存紧张,把处于Paused和Stopped状态下的Activity回收,然后再重新启动。

它有个形式参数saveInstanceState,它主要保存Activity由于系统内存不足等原因,被系统隐式销毁Activity,在被销毁之前一般的会调用onSaveInstanceState(),保留该Activity此时的状态信息。该方法中传入Bundle参数,系统会保留,当再次启动时,通过onCreate()方法传入。

2、onStart()

一般情况下,该方法是在onCreate()之后调用或者在Stopped状态返回时调用。用户重新查看窗体时会执行。

3、onResume()

启动过程成执行onCreate()-->onStart()-->onResume()或者 当Activity处于Stopped状态onStopped()-->onResume()

当Activity处于Paused状态时onPause()-->onResume()

4、onPause()

一般窗体被交换到后台时执行onPause(),一般在onPause()中保存永久性数据。

5、onStop()

onPause()-->onStop()。  Activity页面切换,或者用户直接按Back键,将该窗体从当前任务重移除,也会执行onStop()

6、onRestart()

onStop()执行之后,该窗体和进程没有被系统销毁,此时用户又重新查看该窗体,则会执行窗体的onRestart()--->onStart()

7、onDestroy()

Activity被销毁时执行onDestroy()。

 

Activity的四种加载模式

1.Activity栈

Android采用Task来管理多个Activity,当我们启动一个应用时,Activity就会为之创建一个Task,然后启动这个应用的入口Activity(即intent-filter中配置为MAIN和LAUNCHER的Activity)。

我们可以把Task理解为Activity栈。Task以栈的形式来管理Activity,根据栈“先进后出”的原则,先启动的Activity被压入栈底,后启动的Activity放在栈顶。如果我们按Back键,则最上面的Activity被弹出栈。

2、四种加载模式

配置Activity时可以指定android:launchMode属性,用于配置Activity的加载模式

1、standard  :默认加载模式(始终创建新实例)

启动目标Activity时,总会为该Activity创建一个新的实例,并放入当前的Task的栈顶中。

2、singleTop:顶单例模式(栈顶有实例则不再创建新实例)

启动目标Activity时,若已经有一个目标Activity位于栈顶,则不会创建新的目标Activity实例,而是复用原有的。

若没有目标Activity位于栈顶,则会创建一个新的目标Activity实例,并添加至当前Task的栈顶。

3、singleTask:内单例模式(保持一个Task内只有一个实例)

若当前Task内不存在目标Activity实例,则会创建一个新的目标Activity实例,并添加至当前Task的栈顶。

启动目标Activity时,若已经有一个目标Activity实例位于栈顶,则不会创建新的目标Activity实例,而是复用原有的。

启动目标Activity时,若当前Task内已经有一个目标Activity实例,但不位于栈顶,则会移除该实例上面的所有Activity,从而使该实例转入栈顶。

4、singleInstance 全局单例模式(保持所有Task内只有一个实例,且用一个单独的Task栈放这个实例)

若目标Activity的实例不存在,则会创建一个全新的Task,再创建一个该Activity的实例,并将其加入新Task的栈顶。

若已经存在,则会将该实例所在的Task转到前台。

 

 

启动、关闭Activity

启动其他Activity:startActivity(Intent intent)

关闭当前Activity:finish()

startActivityForResult的使用

A-Activity需要在B-Activtiy中执行一些数据操作,跳转至B-Activity后,B-Activity要将执行操作数据的结果返回给A-Activtiy,此时就需要使用 startActivityForResult()来启动B-Activity了。

使用的三个函数:

startActivityForResult(Intent intent, Int requestCode)
setResut(int resultCode, Intent intent)
onActivityResult(int requestCode, int resultCode, Intent intent)

步骤:

1、在A中跳转的时候不是采用startActivity(intent) 这个方法,而是startActivityForResult(intent, Int requestCode)的形式,requestCode可以是大于等于0的任何值。

startActivityForResult(intent, 0);

2、在A中重写onActivityResult方法,用来接收B回传的数据,因为传回来的resultCode不同而做差别处理。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {switch (resultCode) { //resultCode为回传的标记
   case 
20
:    Bundle b=data.getExtras(); //data为B中回传的Intent    String str=b.getString("str1");//str即为回传的值    break;default:    break;    }}

3、在B中采用setResult方法,并且之后要调用finish方法。

Intent intent=new Intent();  intent.putExtra("str1", str_bookname);  setResult(20, data);  finish(); //关闭掉这个Activity 

 

使用Bundle在Activity间传值

Activity使用Bundle包来携带数据,Bundle对象有如下方法:

putXxx(String key,Xxx data) : 向Bundle中放入int、String等各种类型的数据

putSerializable(String key,Serializable data) : 向Bundle中放入可序列化的对象

getXxx(String key):取出int、String等各种类型的数据

getSerializable(String key):取出可序列化的对象

 

当然我们还可以直接调用intent对象的putExtra(String key,Xxx data)方法存入数据,但其本质还是创建或使用了Bundle对象进行传值。

Android中Activity完全解析