标签:
Activity是存放在栈(返回栈Back Stack)中的,栈是一种先进后出的数据结构;当我们打开了一个新的Activity时,该Activity会将前面的Activity压入栈底,当前打开的Activity代替前一个处于栈顶位置;当我们按下安卓手机的back键或者是调用finish()方法去摧毁一个活动时,这时处于栈顶的Activity就会出栈,而前一个Activity又会回到栈顶的位置。
在介绍Activity的生命周期之前,先介绍一下Activity在生命周期中可能出现的四种状态。
状态1、Running(运行)状态:当一个新的Activity启动入栈后,它在屏幕最前端,处于栈的最顶端;此时它处于可见并可和用户交互的运行状态。系统最不愿意回收的就是处于运行状态的活动,因为这会带来非常差的用户体验。
状态2、Paused(暂停)状态当:Activity被另一个透明或Dialog样式的Activity覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,它仍然可见,但它已经失去了焦点,故不可与用户交互。
状态3、Stopped(停止)状态:当Activity不可见时,Activity处于Stopped状态。当Activity处于此状态时,一定要保存当前数据和当前的UI状态,否则一旦Activity退出或关闭时,当前的数据和UI状态就丢失了。
状态4、Killed(销毁)状态: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项目中,创建两个Activity:MainActivity.java与SecondActivity.java和两个布局文件first_activity.xml与second_activity.xml;其中MainActivity.java与first_activity.xml关联,SecondActivity.java与second_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()方法。
标签:
原文地址:http://www.cnblogs.com/rocking7189/p/5689704.html