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); } }