Activity的生命周期

1.什么是Activity?

Android的四大基本组件:

             Activity(手机屏幕)

            BroadcastReceiver(广播接受者)

             Services服务

            ContentProvider(内容提供者)


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下的日志文件来理解:


[java] view plain copy

    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";  
      
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            Log.i(TAG, "onCreate");  
        }  
      
        @Override  
        protected void onRestart() {  
            super.onRestart();  
            Log.i(TAG, "onRestart");  
        }  
      
        @Override  
        protected void onStart() {  
            super.onStart();  
            Log.i(TAG, "onStart");  
        }  
      
        @Override  
        protected void onResume() {  
            super.onResume();  
            Log.i(TAG, "onResume");  
        }  
      
        @Override  
        protected void onPause() {  
            super.onPause();  
            Log.i(TAG, "onPause");  
        }  
      
        @Override  
        protected void onStop() {  
            super.onStop();  
            Log.i(TAG, "onStop");  
        }  
      
        @Override  
        protected void onDestroy() {  
            super.onDestroy();  
            Log.i(TAG, "onDestroy");  
        }  
      
        @Override  
        protected void onSaveInstanceState(Bundle outState) {  
            super.onSaveInstanceState(outState);  
            Log.i(TAG, "onSaveInstanceState");  
        }  
          
        @Override  
        protected void onRestoreInstanceState(Bundle savedInstanceState) {  
            super.onRestoreInstanceState(savedInstanceState);  
            Log.i(TAG, "onRestoreInstanceState");  
        }  
          
        @Override  
        public 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;  
      
        @Override  
        protected 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() {  
                  
                @Override  
                public void onClick(View v) {  
                    //启动AActivity  
                    startActivity(new Intent(AActivity.this, AActivity.class));  
                }  
            });  
            buttonB.setOnClickListener(new View.OnClickListener() {  
                  
                @Override  
                public void onClick(View v) {  
                    //启动AActivity  
                    startActivity(new Intent(AActivity.this, BActivity.class));  
                }  
            });  
        }  
      
        @Override  
        protected void onRestart() {  
            super.onRestart();  
    //      Log.i(TAG, "A onRestart");  
        }  
      
        @Override  
        protected void onStart() {  
            super.onStart();  
    //      Log.i(TAG, "A onStart");  
        }  
      
        @Override  
        protected void onResume() {  
            super.onResume();  
    //      Log.i(TAG, "A onResume");  
        }  
      
        @Override  
        protected void onPause() {  
            super.onPause();  
    //      Log.i(TAG, "A onPause");  
        }  
      
        @Override  
        protected void onStop() {  
            super.onStop();  
    //      Log.i(TAG, "A onStop");  
        }  
      
        @Override  
        protected void onDestroy() {  
            super.onDestroy();  
    //      Log.i(TAG, "A onDestroy");  
        }  
      
        @Override  
        protected void onSaveInstanceState(Bundle outState) {  
            super.onSaveInstanceState(outState);  
    //      Log.i(TAG, "A onSaveInstanceState");  
        }  
          
        @Override  
        protected void onRestoreInstanceState(Bundle savedInstanceState) {  
            super.onRestoreInstanceState(savedInstanceState);  
    //      Log.i(TAG, "A onRestoreInstanceState");  
        }  
          
        @Override  
        public 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;  
      
        @Override  
        protected 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() {  
                  
                @Override  
                public void onClick(View v) {  
                    //启动AActivity  
                    startActivity(new Intent(BActivity.this, AActivity.class));  
                }  
            });  
            buttonB.setOnClickListener(new View.OnClickListener() {  
                  
                @Override  
                public void onClick(View v) {  
                    //启动AActivity  
                    startActivity(new Intent(BActivity.this, BActivity.class));  
                }  
            });  
        }  
      
        @Override  
        protected void onRestart() {  
            super.onRestart();  
    //      Log.i(TAG, "B onRestart");  
        }  
      
        @Override  
        protected void onStart() {  
            super.onStart();  
    //      Log.i(TAG, "B onStart");  
        }  
      
        @Override  
        protected void onResume() {  
            super.onResume();  
    //      Log.i(TAG, "B onResume");  
        }  
      
        @Override  
        protected void onPause() {  
            super.onPause();  
    //      Log.i(TAG, "B onPause");  
        }  
      
        @Override  
        protected void onStop() {  
            super.onStop();  
    //      Log.i(TAG, "B onStop");  
        }  
      
        @Override  
        protected void onDestroy() {  
            super.onDestroy();  
    //      Log.i(TAG, "B onDestroy");  
        }  
      
        @Override  
        protected void onSaveInstanceState(Bundle outState) {  
            super.onSaveInstanceState(outState);  
    //      Log.i(TAG, "B onSaveInstanceState");  
        }  
          
        @Override  
        protected void onRestoreInstanceState(Bundle savedInstanceState) {  
            super.onRestoreInstanceState(savedInstanceState);  
    //      Log.i(TAG, "B onRestoreInstanceState");  
        }  
          
        @Override  
        public 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>  




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值