Activity是Android中最重要,最常见,也是最基本的组件,下面来详细介绍下Activity。
介绍
一个Acitvity作为一个显示在屏幕上的用户交互界面,比如在电子邮件应用中比如:一个用来显示收件列表的Activity,一个用来写邮件的Activity,一个阅读邮件内容的Activity,等等。Activity用来提供用户体验,许多不同体验的Activity聚集在一起即可以形成一个Android应用程序的用户体验,每一Activity都是相互独立的。应用除了可以访问自己的Activity,也可以访问其他APP的Acitivity(需要被APP允许)。
其次,Activity类间接或者直接的继承了Content,ContextWrapper,ContextThemeWrapper等基类,所以Activity可以直接调用他们的方法。为了让Service能够响应用户请求开发者需要重写HttpService的doRequest(...),doResponse(。。)方法,或者重写Service(...),Activity与此类似,创建一个Activity也需要实现一个或多个方法,其中最常见的就是实现onCreate(Bundle status),该方法会在Activity创建时被回调,该方法调用Activity的setContentView(View view)方法来显示要展示的View,为了管理应用程序中的各组件,调用Activity的findViewById(int id)方法来获取程序界面中的组件。
Activity的生命周期
一个Activity的启动顺序:
onCreate()——>onStart()——>onResume()
当另一个Activity启动时:
第一个Activity onPause()——>第二个Activity onCreate()——>onStart()——>onResume()
——>第一个Activity onStop()
当返回到第一个Activity时:
第二个Activity onPause() ——> 第一个Activity onRestart()——>onStart()——>onResume()
——>第二个Activity onStop()——>onDestroy()
一个Activity的销毁顺序:
(情况一)onPause()——><Process Killed>
(情况二)onPause()——>onStop()——><Process Killed>
(情况三)onPause()——>onStop()——>onDestroy()
每一个活动( Activity )都处于某一个状态,对于开发者来说,是无法控制其应用程序处于某一个状态的,这些均由系统来完成。
但是当一个活动的状态发生改变的时候,开发者可以通过调用 onXX() 的方法获取到相关的通知信息。
在实现 Activity 类的时候,通过覆盖( override )这些方法即可在你需要处理的时候来调用。
一、 onCreate :当活动第一次启动的时候,触发该方法,可以在此时完成活动的初始化工作。
onCreate 方法有一个参数,该参数可以为空( null ),也可以是之前调用onSaveInstanceState ()方法保存的状态信息。
二、 onStart :该方法的触发表示所属活动将被展现给用户。
三、 onResume :当一个活动和用户发生交互的时候,触发该方法。
四、 onPause :当一个正在前台运行的活动因为其他的活动需要前台运行而转入后台运行的时候,触发该方法。这时候需要将活动的状态持久化,比如正在编辑的数据库记录等。
五、 onStop :当一个活动不再需要展示给用户的时候,触发该方法。如果内存紧张,系统会直接结束这个活动,而不会触发 onStop 方法。 所以保存状态信息是应该在onPause时做,而不是onStop时做。活动如果没有在前台运行,都将被停止或者Linux管理进程为了给新的活动预留足够的存储空间而随时结束这些活动。因此对于开发者来说,在设计应用程序的时候,必须时刻牢记这一原则。在一些情况下,onPause方法或许是活动触发的最后的方法,因此开发者需要在这个时候保存需要保存的信息。
六、onRestart :当处于停止状态的活动需要再次展现给用户的时候,触发该方法。
七、 onDestroy :当活动销毁的时候,触发该方法。和onStop 方法一样,如果内存紧张,系统会直接结束这个活动而不会触发该方法。
· onSaveInstanceState :系统调用该方法,允许活动保存之前的状态,比如说在一串字符串中的光标所处的位置等。
通常情况下,开发者不需要重写覆盖该方法,在默认的实现中,已经提供了自动保存活动所涉及到的用户界面组件的所有状态信息。
与Activity 生命周期相关的方法
在 android.app.Activity类中,Android 定义了一系列与生命周期相关的方法,在我们自己的 Activity 中,只是根据需要复写需要的方法,Java 的多态性会保证我们自己的方法被虚拟机调用,这一点与 J2ME 中的 MIDlet 类似。
public class OurActivity extends Activity { protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy(); }
这些方法的说明如下:
- protected void onCreate(Bundle savedInstanceState)一个 Activity 的实例被启动时调用的第一个方法。一般情况下,我们都覆盖该方法作为应用程序的一个入口点,在这里做一些初始化数据、设置用户界面等工作。大多数情况下,我们都要在这里从 xml 中加载设计好的用户界面。例如:
setContentView(R.layout.main);
当然,也可从 savedInstanceState中读我们保存到存储设备中的数据,但是需要判断 savedInstanceState是否为 null,因为 Activity 第一次启动时并没有数据被存贮在设备中:
if(savedInstanceState!=null){ savedInstanceState.get("Key"); }
- protected void onStart()该方法在 onCreate() 方法之后被调用,或者在 Activity 从 Stop 状态转换为 Active 状态时被调用。
- protected void onResume()在 Activity 从 Pause 状态转换到 Active 状态时被调用。
- protected void onPause()在 Activity 从 Active 状态转换到 Pause 状态时被调用。
- protected void onStop()在 Activity 从 Active 状态转换到 Stop 状态时被调用。一般我们在这里保存 Activity 的状态信息。
- protected void onDestroy()在 Active 被结束时调用,它是被结束时调用的最后一个方法,在这里一般做些释放资源,清理内存等工作。
Activity状态转化图
如上所示,Android 程序员可以决定一个 Activity 的“生”,但不能决定它的“死”,也就时说程序员可以启动一个 Activity,但是却不能手动的“结束”一个 Activity。当你调用 Activity.finish()方法时,结果和用户按下 BACK 键一样:告诉 Activity Manager 该 Activity 实例完成了相应的工作,可以被“回收”[ 根据下文的意思,应该是调用finish方法时只能使Activity进入Stoped状态 ]。随后 Activity Manager 激活处于栈第二层的 Activity 并重新入栈,同时原 Activity 被压入到栈的第二层,从 Active 状态转到 Paused 状态。例如:从 Activity1 中启动了 Activity2,则当前处于栈顶端的是 Activity2,第二层是 Activity1,当我们调用 Activity2.finish()方法时,Activity Manager 重新激活 Activity1 并入栈,Activity2 从 Active 状态转换 Stoped 状态,Activity1. onActivityResult(int requestCode, int resultCode, Intent data)方法被执行,Activity2 返回的数据通过 data参数返回给 Activity1。
创建一个Activity的流程
首先,创建Activit
y
一个Activity创建完成后,为了它可以访问系统必须要声明注册它到应用的AndroidManifest.xml文件中:
重写onCreate方法
onCreate(),当活动第一次启动时,触发该方法,可以在此时完成活动的初始化工作,此方法必须要重写。系统调用此方法创建activity,实现该方法是你初始化你所创建Activity的重要步骤。其中最重要的就是调用 setContentView() 去定义你的要展现的用户界面的布局。