Activity的生命周期理解

Activity拥有4个基本状态:

活动状态:当前Activity位于前台,可以看见也可以获得焦点,可以接受用户输入的

暂停状态:其他Activity位于前台,该Activity依然可见,但是不能获得焦点(比如一个非全屏或者透明的Activity在你的Activity的上方拥有焦点),它的状态是暂停的。一个暂停状态下的Activity是活着的,但在系统极端低的状态下可以被杀死

停止状态:当一个Activity完全被另一个Activity遮盖,它的状态是停止的。该Activity不可见,失去焦点。这种状态很容易被系统杀死

销毁状态:该Activity被系统 结束,该Activity结束或Activity所在的Dalvik进程被结束

Activity的生命周期图:

我们来说一下Activity的生命周期过程:

运行-暂停-运行:

onCreate->onStart->onResume->**onPause->onResume**

1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。
2.当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。
3.当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。

运行-停止-运行:

onCreate->onStart->onResume->onPause->**onStop->onRestart->onStart->onResume**
4.当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台,不可见失去焦点:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。
5.用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。

运行-销毁:
6.当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。
7.用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。

Activity有三个关键的循环: 
整个的生命周期,从onCreate(Bundle)开始到onDestroy()结束。Activity在onCreate()设置所有的“全局”状态,在onDestory()释放所有的资源。例如:某个Activity有一个在后台运行的线程,用于从网络下载数据,则该Activity可以在onCreate()中创建线程,在onDestory()中停止线程。
可见的生命周期,从onStart()开始到onStop()结束。在这段时间,可以看到Activity在屏幕上,尽管有可能不在前台,不能和用户交互。在这两个接口之间,需要保持显示给用户的UI数据和资源等,例如:可以在onStart中注册一个IntentReceiver来监听数据变化导致UI的变动,当不再需要显示时候,可以在onStop()中注销它。onStart(),onStop()都可以被多次调用,因为Activity随时可以在可见和隐藏之间转换。
前台的生命周期,从onResume()开始到onPause()结束。在这段时间里,该Activity处于所有 Activity的最前面,和用户进行交互。Activity可以经常性地在resumed和paused状态之间切换,例如:当设备准备休眠时,当一个 Activity处理结果被分发时,当一个新的Intent被分发时。所以在这些接口方法中的代码应该属于非常轻量级的。

MainActivity.java


package com.example.activitylifecircle;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;


public class MainActivity extends Activity {
     final String TAG="-Activity State-";
     Button finish,start;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "--OnCreate--");
        finish=(Button) findViewById(R.id.button1);
        start=(Button) findViewById(R.id.button2);
        start.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent=new Intent(MainActivity.this,SecondActivity.class);
				startActivity(intent);
			}
        	
        });
       finish.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				//结束该Activity
				MainActivity.this.finish();
			}
        	
        });
        
    }

    @Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		 Log.d(TAG, "--OnStart--");
	}

	@Override
	protected void onRestart() {
		// TODO Auto-generated method stub
		super.onRestart();
		 Log.d(TAG, "--OnRestart--");
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		 Log.d(TAG, "--OnResume--");
	}

	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		 Log.d(TAG, "--OnPause--");
	}

	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		 Log.d(TAG, "--OnStop--");
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		 Log.d(TAG, "--OnDestroy--");
	}

	@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}


文章导航