码迷,mamicode.com
首页 > 其他好文 > 详细

Activity的生命周期

时间:2016-07-20 22:48:48      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:

Activity是存放在栈(返回栈Back Stack)中的,栈是一种先进后出的数据结构;当我们打开了一个新的Activity时,该Activity会将前面的Activity压入栈底,当前打开的Activity代替前一个处于栈顶位置;当我们按下安卓手机的back键或者是调用finish()方法去摧毁一个活动时,这时处于栈顶的Activity就会出栈,而前一个Activity又会回到栈顶的位置。

在介绍Activity的生命周期之前,先介绍一下Activity在生命周期中可能出现的四种状态。

状态1Running(运行)状态:当一个新的Activity启动入栈后,它在屏幕最前端,处于栈的最顶端;此时它处于可见并可和用户交互的运行状态。系统最不愿意回收的就是处于运行状态的活动,因为这会带来非常差的用户体验。
状态2Paused(暂停)状态当:Activity被另一个透明或Dialog样式的Activity覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,它仍然可见,但它已经失去了焦点,故不可与用户交互。
状态3Stopped(停止)状态:当Activity不可见时,Activity处于Stopped状态。当Activity处于此状态时,一定要保存当前数据和当前的UI状态,否则一旦Activity退出或关闭时,当前的数据和UI状态就丢失了。
状态4Killed(销毁)状态:Activity被杀掉以后或者被启动以前,处于Killed状态。这是Activity已从Activity堆栈中移除,需要重新启动才可以显示和使用。

在上述4种状态中,Running状态和Paused状态是可见的,Stopped状态和Killed状态时不可见的。

Activity类中定义了七个回调方法,覆盖了Activity生命周期的每一个环节,注意:实现这些生命周期方法时,必须保证在其它代码之前首先调用一下父类的方法(super.回调方法)

在详细讲这七个回调方法之前,先贴上官网的一张Activity的生命周期图

技术分享 

1、onCreate()

之前创建的HelloWorld程序中的MainActivity.java文件中就出现了该方法,其实,对于每个活动,我们都要重写该方法。在上图中,我们可以看到:当活动被启动时,首先会调用onCreate()方法,且只会调用一次。在该方法中一般是用来完成活动的初始化操作,比如说加载布局、绑定事件等。因此在实现该方法的同时,还需要实现Activity的重要组件, 最重要的是,必须在onCreate()方法中调用setContentView()来关联Activity用于与用户进行交互的布局。

2、onStart()

该方法是在Activity界面被显示出来的时候调用的。

3、onResume()

该方法是在Activity准备好了与用户进行交互的时候调用。由上面官网给出的生命周期图中可以看出,当程序第一次启动时,会依次调用onCreate()onStart()onResume()三个方法,然后活动处于运行状态,前面了解到:当活动处于运行状态时,Activity是一定位于返回栈的栈顶的。

4、onPause()

该方法在系统准备去启动或者恢复另一个Activity的时候调用。此时该Activity处于暂停状态,不过还是可见的。我们通常会在该方法中将一些消耗CPU的资源释放掉,以及执行保存一些当前关键数据的操作。但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。

5、onStop()

该方法表示另一个Activity完全启动,使得当前的Activity不再可见的时候,将调用该方法,此时该Activity处于停止状态。它和onPause()方法的主要区别在于,如果启动的新活动是一个对话框式的活动,那么onPause()方法会得到执行,而onStop()方法并不会执行。

6、onDestroy()

该方法在退出当前Activity时调用,当然如果程序中调用finish()或者说Android系统当前资源不够用时也会被调用,之后活动将处于销毁状态。

7、onRestart()

在之前的Activity被重新启动时调用该方法,

 

下面通过代码来体验一下Activity的生命周期;在创建的LearnActivity项目中,创建两个ActivityMainActivity.javaSecondActivity.java和两个布局文件first_activity.xmlsecond_activity.xml;其中MainActivity.javafirst_activity.xml关联,SecondActivity.javasecond_activity.xml关联。具体代码如下:

MainActivity.java

public class MainActivity extends Activity implements View.OnClickListener {
    private Button create_dialog, start_secondActivity;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_activity);
        Log.i("Tag", "onCreate");
        // The activity is being created.

        //获取Button组件
        create_dialog = (Button) findViewById(R.id.create_dialog);
        start_secondActivity = (Button) findViewById(R.id.start_secondActivity);
        //以实现View.OnClickListener接口的方式为Button组件添加事件监听器
        create_dialog.setOnClickListener(this);
        start_secondActivity.setOnClickListener(this);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i("Tag", "onStart");
        // The activity is about to become visible.
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("Tag", "onResume");
        // The activity has become visible (it is now "resumed").
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i("Tag", "onPause");
        // Another activity is taking focus (this activity is about to be "paused").
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i("Tag", "onStop");
        // The activity is no longer visible (it is now "stopped")
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i("Tag", "onRestart");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("Tag", "onDestroy");
        // The activity is about to be destroyed.
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.create_dialog:
                //创建AlertDialog实例
                AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
                //为AlertDialog设置其属性
                dialog.setTitle("This is a Dialog");
                dialog.setMessage("something");
                //在对话框中添加两个按钮,并添加事件监听器
                dialog.setPositiveButton("确认", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();   //取消对话框
                    }
                });
                dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();   //取消对话框
                    }
                });
                dialog.show();  //将创建的对话框显示出来
                break;
            case R.id.start_secondActivity:
                Intent intent = new Intent();
                intent.setClass(this, SecondActivity.class);
                startActivity(intent);
                break;
            default:
                break;
        }
    }
}

SecondActivity.java

public class SecondActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_activity);
    }
}

first_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.rocking.learnactivity.MainActivity"
    android:orientation="vertical">
    <Button
        android:id="@+id/create_dialog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="创建一个Dialog"/>
    <Button
        android:id="@+id/start_secondActivity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="启动第二个Activity"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="这是第一个Activity"/>
</LinearLayout>

second_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.rocking.learnactivity.MainActivity">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="这是第二个Activity"/>
</LinearLayout>

当然,别忘了在AndroidManifest.xml文件中对创建的两个Activity进行注册:

<activity
    android:name=".MainActivity"
    android:label="This is FirstActivity" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity android:name=".SecondActivity"/>

代码完成之后,就可以开始运行程序了,运行状态与结果如下:

1、运行程序,使程序自动在手机上打开MainActivity的界面,此时通过打印信息可以发现MainActivity依次调用了onCreate()onStart()onResume()方法。

技术分享

2、当我们点击"启动第二个Activity"的按钮时,此时SecondActivity代替MainActivity处于返回栈的栈顶位置。MainActivity依次调用onPause()onStop()方法。

技术分享 

3、按下手机的back键,又从SecondActivity回到MainActivity界面时,MainActivity会依次调用onRestart()onStart()onResume()方法。

技术分享 

4、当按下手机的home键或者是锁屏时,MainActivity会依次调用onPause()onStop()方法

技术分享 

5、用户在之前按下home键的基础上又回到了程序,或者是解锁完屏幕,此时又是处于MainActivity界面。它会依次调用onRestart()onStart()onResume()方法。

技术分享

6、当点击"创建一个Dialog"的按钮时,会在MainActivity的界面上显示一个对话框,但是和了解到的活动失去焦点,但是可见时,会调用onPause()方法相反。MainActivity并没有调用任何的方法(PS:如果是当前Activity弹出的Dialog则不会执行Activity任何生命周期中的方法,只有其它Activity弹出了Dialog或者拦住了当前的Activity才会执行onPause()方法)

7、点击back退出程序或者是先按home键退到主界面,再进行内存清理时,MainActivity会依次调用onPause()onStop()onDestroy()方法。不过在MainActivity界面直接通过清理内存结束该程序,则只会调用onPause()方法。

技术分享

 

 

 

Activity的生命周期

标签:

原文地址:http://www.cnblogs.com/rocking7189/p/5689704.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!