Android四大组件之Activity
Android 中,Activity 是所有程序的根本,所有程序的流程都运行在Activity 之中,Activity可以算是开发者遇到的最频繁,也是Android 当中最基本的模块之一。在Android的程序当中,Activity 一般代表手机屏幕的一屏。如果把手机比作一个浏览器,那么Acitivity就相当于一个网页。在Activity 当中可以添加一些Button、Check box 等控件。可以看到Activity 概念和网页的概念相当类似。
一般一个Android 应用是由多个Activity 组成的。这多个Activity 之间可以进行相互跳转,例如,按下一个Button 按钮后,可能会跳转到其他的Activity。和网页跳转稍微有些不一样的是,Activity 之间的跳转有可能返回值,例如,从Activity A 跳转到Activity B,那么当Activity B 运行结束的时候,有可能会给Activity A 一个返回值。这样做在很多时候是相当方便的。
当打开一个新的屏幕时,之前一个屏幕会被置为暂停状态,并且压入历史堆栈中。用户可以通过回退操作返回到以前打开过的屏幕。我们可以选择性的移除一些没有必要保留的屏幕,因为Android 会把每个应用的开始到当前的每一个屏幕保存在堆栈中。Activity 是由Android 系统进行维护的,它也有自己的生命周期,即它的一个产生、运行、销毁的一个周期,对于Activity,关键是其生命周期的把握,其次就是状态的保存和恢复(onSaveInstanceState onRestoreInstanceState),以及Activity 之间的跳转和数据传输(intent)。
在Android中如何创建一个Activity呢?可以按下面步骤来做:
1、创建Activity类及相关的视图文件Layout(View),用户自己创建的Activity类需要继承自android.app.Activity类
2、配置AndroidManifest.xml文件
<manifest ... > <application ... > <activity android:name=".ExampleActivity" /> ... </application ... > ...</manifest >
3、重载onCreate,绑定Activity和Layout(View)
4、为View添加必要组件,可以在XML文件中添加,也可以在程序中动态添加。
5、在onCreate()中实现初始业务逻辑,如为按钮添加事件
学习Activity需要注意以下几个重点:
Activity的生命周期:
要深刻理解上面这一张Activity的生命周期图。可以通过下面操作这个例子程序,查看LogCat下的日志文件来理解:
package com.mobidever.activity;import android.app.Activity;import android.content.res.Configuration;import android.os.Bundle;import android.util.Log;public class LifecycleActivity extends Activity {private static final String TAG = "LifecycleActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.i(TAG, "onCreate");}@Overrideprotected void onRestart() {super.onRestart();Log.i(TAG, "onRestart");}@Overrideprotected void onStart() {super.onStart();Log.i(TAG, "onStart");}@Overrideprotected void onResume() {super.onResume();Log.i(TAG, "onResume");}@Overrideprotected void onPause() {super.onPause();Log.i(TAG, "onPause");}@Overrideprotected void onStop() {super.onStop();Log.i(TAG, "onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.i(TAG, "onDestroy");}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);Log.i(TAG, "onSaveInstanceState");}@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);Log.i(TAG, "onRestoreInstanceState");}@Overridepublic void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);Log.i(TAG, "onConfigurationChanged");}}
Activity状态的保存与恢复
Android系统默认有一套Activity的状态保存机制,比如当在一个Activity的文本框内输入了一些值,然后又打开了另外一个新的Activity,当再次回到上一个Activity时,文本框内的值还会存在,但是这是在这个Activity还没有被destroy掉的时候才可以,如果系统因为内存不足而将该Activity给destory掉的话,再次回到该Activity时,就没有那些原来的输入的值了,这时候该Activity要重新创建一次。因此我们很多时候需要自己写程序来处理这种情况,可以通过覆写onSaveInstanceState()方法来实现,可以参考简易音频播放器的例子-http://blog.csdn.net/geniusxiaoyu/article/details/7305270
Activity的任务栈
Activity的任务栈遵循后进先出的原则,关于任务栈可以参考下面的例子,通过点击StartActivityA与StartActivityB按钮,查看日志
layout:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/buttonA" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/buttonAText" /> <Button android:id="@+id/buttonB" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/buttonBText" /></LinearLayout>
values/string.xml
<?xml version="1.0" encoding="utf-8"?><resources> <string name="hello">Hello World, ActivityCourseActivity!</string> <string name="app_name">ActivityCourse</string> <string name="another">AnotherActivity</string> <string name="lifecycle">LifecycleActivity</string> <string name="button1Text">StartAnotherActivity-1</string> <string name="button2Text">StartAnotherActivity-2</string> <string name="button3Text">DialPhone</string> <string name="button4Text">StartLifecycleActivity</string> <string name="buttonAText">StartActivityA</string> <string name="buttonBText">StartActivityB</string> <string name="aactivity">AActivity</string> <string name="bactivity">BActivity</string></resources>
AActivity.java
package com.mobidever.activity;import android.app.Activity;import android.content.Intent;import android.content.res.Configuration;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;public class AActivity extends Activity {private static final String TAG = "ActivityStack";private static int mIndex = 1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.stack);Log.i(TAG, "A" + ++mIndex + " onCreate,taskId:" + getTaskId());Button buttonA = (Button)this.findViewById(R.id.buttonA);Button buttonB = (Button)this.findViewById(R.id.buttonB);buttonA.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//启动AActivitystartActivity(new Intent(AActivity.this, AActivity.class));}});buttonB.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//启动AActivitystartActivity(new Intent(AActivity.this, BActivity.class));}});}@Overrideprotected void onRestart() {super.onRestart();//Log.i(TAG, "A onRestart");}@Overrideprotected void onStart() {super.onStart();//Log.i(TAG, "A onStart");}@Overrideprotected void onResume() {super.onResume();//Log.i(TAG, "A onResume");}@Overrideprotected void onPause() {super.onPause();//Log.i(TAG, "A onPause");}@Overrideprotected void onStop() {super.onStop();//Log.i(TAG, "A onStop");}@Overrideprotected void onDestroy() {super.onDestroy();//Log.i(TAG, "A onDestroy");}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);//Log.i(TAG, "A onSaveInstanceState");}@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);//Log.i(TAG, "A onRestoreInstanceState");}@Overridepublic void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);//Log.i(TAG, "A onConfigurationChanged");}}
BActivity.java
package com.mobidever.activity;import android.app.Activity;import android.content.Intent;import android.content.res.Configuration;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;public class BActivity extends Activity {private static final String TAG = "ActivityStack";private static int mIndex = 1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.stack);Log.i(TAG, "B" + ++mIndex + " onCreate,taskId:" + getTaskId());Button buttonA = (Button)this.findViewById(R.id.buttonA);Button buttonB = (Button)this.findViewById(R.id.buttonB);buttonA.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//启动AActivitystartActivity(new Intent(BActivity.this, AActivity.class));}});buttonB.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//启动AActivitystartActivity(new Intent(BActivity.this, BActivity.class));}});}@Overrideprotected void onRestart() {super.onRestart();//Log.i(TAG, "B onRestart");}@Overrideprotected void onStart() {super.onStart();//Log.i(TAG, "B onStart");}@Overrideprotected void onResume() {super.onResume();//Log.i(TAG, "B onResume");}@Overrideprotected void onPause() {super.onPause();//Log.i(TAG, "B onPause");}@Overrideprotected void onStop() {super.onStop();//Log.i(TAG, "B onStop");}@Overrideprotected void onDestroy() {super.onDestroy();//Log.i(TAG, "B onDestroy");}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);//Log.i(TAG, "B onSaveInstanceState");}@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);//Log.i(TAG, "B onRestoreInstanceState");}@Overridepublic void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);//Log.i(TAG, "B onConfigurationChanged");}}
在manifest文件中添加Activity
<activity android:name=".AActivity" android:label="@string/aactivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".BActivity" android:label="@string/bactivity"> </activity>
更多相关文章
- Android 逆向apk程序的心得
- Android应用程序注冊广播接收器(registerReceiver)的过程分析
- Android应用程序签名(官方文档中文版)(上)
- 博文视点大讲堂 37 期——It's Android Time :程序员创富有道!圆满
- Android 应用程序窗体显示状态操作(requestWindowFeature()的应用
- 详解Android应用中使用TabHost组件进行布局的基本方法