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控制。
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对象进行传值。