一、什么是Activity?

1.Activity是Android的四大组件之一。

2.一般来说,一个与用户交互的界面对应一个Activity,使用时必须在AndroidManifest(清单)文件中注册(一般情况下,创建Activity时会自动注册了,但需要注意创建多个Activity时,直接用创建类(class)的方式,不会自动注册需要自己去手动注册。),若没有注册就使用了,将会抛出ActivityNotFoundException异常.

3.在Activity中的onCreate()方法通过setContentView(),设置要显示的布局资源。

二、Activity的生命周期

生命周期描述的是一个类,Activity从创建(new出来)到销毁(垃圾回收)的过程经过多种状态,根据不同的生命阶段会执行不同的方法(从一种状态到另一种状态会激发相应的回调方法):

①onCreate()--创建(已创建)

②onStart()--开始(已启动Visible,只是可见,无法交互)

③onResume()--运行(已恢复Visible,处于正在运行状态,获得焦点,可以交互)

④onPause()--暂停(失去焦点)

⑤onStop()--停止

⑥onRestart()--重新开始

⑦onDestory()--销毁



1.定义生命周期的作用:

①当用户跳转到另一个程序(如:接听电话)时不会崩溃

②当该程序在后台运行时不会销毁有价值的系统资源

③当用户重新打开(该程序在后台运行时)该程序时,不会丢失用户的进程(数据)

④当手机屏幕进行横竖屏切换时不会丢失用户的进程



2.横竖屏进行切换时问题的解决:

AndroidManifast.xml文件下Actvity节点下有个属性: android:configChanges

①不设置该属性:横竖屏进行切换时会重新执行各个生命周期,切横屏时会执行一次,切竖屏会执行2次

②设置android:configChanges=“orientation”,切横竖屏会各执行一次生命周期

③设置android:configChanges="orentation|keyboarderHidden",切换横竖屏时不会调用生命周期的方法,之后执行onConfigurationChanged()

注意:


但是,自从Android 3.2(API 13),在设置Activity的android:configChanges="orientation|keyboardHidden"后,还是一样 会重新调用各个生命周期的。因为screen size也开始跟着设备的横竖切换而改变。所以,在AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载Activity,除了设置"orientation", 你还必须设置"ScreenSize"。


解决方法:


AndroidManifest.xml中设置android:configChanges="orientation|screenSize“

3.从一个Activity(A)跳转到另一个Activity(B)

使用Intention(意图)
Intention Intention=new Intent(A.this,B.class);
①startActivity(intention);
②startActivityForresult(intent,int值(返回的code));-------有返回的跳转



4.从一个Activity(A)跳转到另一个Activity(B)经过生命周期的哪些方法?
①必须执行的方法:A:onPause()----②---B:onCreate---B:onStart()---B:onResume()



②如果B完全覆盖了A界面,这个时候回调用A:onStop()

界面后对话框(即能看见部分A界面),不会调用A:onStop()

   如果在A中调用了finish(),这个时候还会执行onDestroy()


5.Activity的启动模式

在AndroidManifast.xml 文件中Activity节点下(设置启动模式):

 <activity android:name=".MainActivity" android:launchMode="standard" />

①standard(标准模式)

一般默认的启动方式为标准模式,即每次激活Activity时都会创建Activity,放到一个任务栈(按先进后出的原则)中,每个(窗体、界面)Actvity的getTaskId()保持不变,但是this.hasCode()发生变化。


②singleTop(单顶模式)

需要启动该Activity时,如果任务栈的栈顶正好存在该Activity的实例,则会重新调用该实例,不会重新创建Activity了。而此时会回调onNewIntent()。如果栈顶没有该Activity实例就会重新创建新的实例(只要不在栈顶,即使在栈里面,都会重新创建新的实例放入栈中)。


③singleTask(单栈模式)

需要启动该Activity时,如果任务栈中已经有该Activity实例了(不管在栈中的位置),就会重新调用该实例,让该实例回到栈顶,此时会回调onNewIntent()方法。否则会重新创建。

④singleInstance(单例模式)

启动该Activity的时候会单独将该Activity实例放入一个栈中,该栈不会再有其他Activity实例。每次调用时他的getTaskId()会发生变化。


总结:在开发Android项目时,巧妙的设置不同的启动模式会节省系统开销和提高程序的运行效率。