Android四大组件之一:Activity详解

来源:互联网 发布:人力资源公司网站源码 编辑:程序博客网 时间:2024/05/18 00:26

一、什么是activity

     Activity 是用户接口程序,原则上它会提供给用户一个交互式的接口功能。它是 android 应用程序的基本功能单元。Activity是单独的,用于处理用户操作, Activity 本身是没有界面的, 但activity类创建了一个窗口,可以通过setContentView(View)接口把UI放到activity创建的窗口上,用于显示View。既然Activity是一个与用户交互的系统模块,几乎所有的Activity都是和用户进行交互的,但是如果这样就能说Activity主要是用来显示View就不太正确了。

 

二、activity生命周期

  

View Code
复制代码
public class Activity extends ApplicationContext {protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onRestart(); protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy();}
复制代码

由图可知:

在一个Activity正常启动过程中,这些方法调用的顺序是onCreate -> onStart -> onResume;在Activity结束的时候方法顺序是onPause -> onStop -> onDestroy,此为一个完整的生命周期。那么对于中断处理(比如电话来了),则是onPause -> onStop,恢复时onStart -> onResume;如果当前应用程序的是一个Theme为Translucent(半透明) 或者Dialog 的Activity那么中断就是onPause ,恢复的时候onResume。

下表更详细的介绍了生命周期函数的事项。

方法

描述

完成后可杀掉?

下一个

onCreate()

当activity被创建时调用。这是做一般的静态初始化的地方,比如创建界面,把数据绑定到列表,等等之类。这个方法会被传入一个Bundle对像,它包含了activity的上一次(关闭时)的状态(如果这个状态可以得到)。此方法后面永远跟着onStart()。

onStart()

onRestart()

在停止后被调用,但不是停止后马上调用,而是在再次开始前调用,也就是在再次调用onStart()之前立即调用。

onStart()

onStart()

当activity变成可见后立即调用它。如果activity成为最上层,则调用onResume(),如果完全被摭盖,就调用onStop()。

onResume()或onStop()

onResume()

当activity处于最上层时,立即调用此方法。此时activity获得输入焦点。后面跟着onPause()。

onPause()

onPause()

当另一个activity要进入Pause状态时调用此方法。这个方法一般是用来提交那些发生改变的永久化的数据们,停止动画和其它消耗CPU的玩意们。这些工作必须以最快的速度完成,因为在这个方法返回之前,另一个activity就不能进入resume状态。当它又回到最上层时,后面跟着onResume(),当它被完全摭盖时,后面跟着onStop()。

onResume()

or

onStop()

onStop()

当activity被完全摭盖时被调用。当activity要销毁时或被其它activity完全摭盖时都会发生。如果这个activity又回到最上层,则后面跟着onRestart(),如果它逝去了,则跟着onDestroy()。

onRestart()

or

onDestroy()

onDestroy()

在activity销毁之前被调用。这是activity能收到的最后一个调用。调用的原因可能是别人在这个activity上调用了finish(),也可能是系统为了更多的内存空间而把它所在的进程处死了。在这个方法中,可以调用isFinishing()来判断自己属于哪一种死法。

nothing

 

三、Activity 栈

Android 是通过一种 Activity 栈的方式来管理 Activity 的,一个 Activity 的实例的状态决定它在栈中的位置。处于前台的 Activity 总是在栈的顶端,当前台的 Activity 因为异常或其它原因被销毁时,处于栈第二层的 Activity 将被激活,上浮到栈顶。当新的 Activity 启动入栈时,原 Activity 会被压入到栈的第二层。一个 Activity 在栈中的位置变化反映了它在不同状态间的转换。Activity 的状态与它在栈中的位置关系如下图所示:

 Activity 的状态与它在栈中的位置关系

如上所示,除了最顶层即处在 Active 状态的 Activity 外,其它的 Activity 都有可能在系统内存不足时被回收,一个 Activity 的实例越是处在栈的底层,它被系统回收的可能性越大。系统负责管理栈中 Activity 的实例,它根据 Activity 所处的状态来改变其在栈中的位置。

 

四、创建Activity

在 android 中创建一个 Activity 是很简单的事情,编写一个继承自 android.app.Activity的 Java 类并在AndroidManifest.xml声明即可。下面是一个为了研究 Activity 生命周期的一个 Activity 实例:

Activity 文件:

 public class SampleActivity extends Activity {     private static final String LOG_TAG = SampleActivity.class.getSimpleName();     @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);              setContentView(R.layout.main);         Log.e(LOG_TAG, "onCreate");     }    @Override     protected void onStart() {         Log.e(LOG_TAG, "onStart");         super.onStart();     }     @Override     protected void onResume() {         Log.e(LOG_TAG, "onResume");         super.onResume();     }     @Override     protected void onPause() {         Log.e(LOG_TAG, "onPause");         super.onPause();     }     @Override     protected void onStop() {         Log.e(LOG_TAG, "onStop");         super.onStop();     }     @Override     protected void onDestroy() {         Log.e(LOG_TAG, "onDestroy ");         super.onDestroy();     }  }
AndroidManifest.xml 中通过 <activity> 节点说明 Activity,将 apk 文件安装后,系统根据这里的说明来查找读取 Activity,本例中的说明如下:
 <activity android:name=".SampleActivity" android:label="@string/app_name">  <intent-filter>  <action android:name="android.intent.action.MAIN" />  <category android:name="android.intent.category.LAUNCHER" />  </intent-filter>  </activity>

一个<activity>元素也能指定多种intent filters--使用<inetent-filter>元素--为了声明其它应用程序可以激活它。

 

        你可以开启另一个activity通过startActivity(),传递一个Intent描述了你希望启动的Activity。Intent指定要么准备的activity你希望启动或描述你希望完成的动作。一个intent可以传输小量数据被启动的activity使用。你可以这么通过创建一个intent显示的定义你希望启动的activity,使用类名。例如,下面显示一个activity怎么启动另一个activity命名为SignInActivity:

  

       

 

0 0