- Activity生命周期的回调方法:
//创建Activity public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } //Activity快要变成可见的 @Override protected void onStart() { super.onStart(); } //Activity变成可见的,处于运行状态 @Override protected void onResume() { super.onResume(); } //其他Activity获得用户焦点,(Activity快要暂停了) @Override protected void onPause() { super.onPause(); } //Activity不再可见,处于停止状态 @Override protected void onStop() { super.onStop(); } //Activity快要被销毁了 @Override protected void onDestroy() { super.onDestroy(); } }
这些方法定义了Activity完整的生命周期,实现这些方法,我们能监控Activity生命周期中的三个嵌套循环(monitor three nested loops in the activity lifecycle)
1. Activity的entire lifetime(全部的生命期)发生在调用onCreate()和调用onDestory()之间。在onCreate()方法中执行全局状态的建立(例如定义布局),在onDestroy()方法中释放所有保存的资源。2. Activity的visible lifetime(可见的生命期)发生在调用onStart()和onStop()之间。在这个期间,用户能在屏幕上看见Activity,和它进行交互。系统在Activity的完整寿命中可能多次调用onStart()和onStop(),正如Activity交替地对用户可见或隐藏。3. Activity的foreground lifetime (前台的生命期)发生在调用onResume()和onPause()之间。在这期间,Activity在屏幕上所有其他Activity的前面,有用户输入焦点。一个Activity能频繁的在前台进入和出去之间转变。下面这张图很好的讲解了Activity的生命周期和上面说的三种生命期:
- 下面就根据上面的过程图进行说明:
-
activity启动的时候:onCreate ---> onStart ---> onResume 这个过程不用多说,大家都知道。
-
通过上图的我们可以看出activity从running状态跳转到onPause状态的原因是:Another activity comes into the foreground. 也就是说有另外一个actvity被启动并运行了,比如说MainActivity通过startActivity启动了SecondActivity,那么SecondActivity就在ui视图的最顶层了,而MainActivity不再是最顶层的activity了,此时就会onPause了,此时我们依稀还能看到MainActivity,只是MainActivity已经站在他人之后了。
-
而当MainActivity完全被SecondActivity挡住,完全看不见的时候,此时MainActivity就会onStop了。我们看看上图从onPause到onStop的原因是:the activity is no longer visiable. 也就是说此时MainActivity完全不可见了,从这里我们可以猜测当按下home键的时候,当前activity就会处于onStop的状态。
-
从actvitiy的生命周期图中,我们可以看出activity是可以停留在onPause和onStop在这两个状态上的,因为可以相应的恢复。
SecondActivity:package com.example.activitytest; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { private Button btn; private static final String TAG = "ActivityTest"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "MainActivity onCreate"); setContentView(R.layout.activity_main); btn = (Button)findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this,SecondActivity.class); startActivity(intent); } }); } @Override protected void onPause() { Log.d(TAG, "MainActivity onPause "); super.onPause(); } @Override protected void onResume() { Log.d(TAG, "MainActivity onResume "); super.onResume(); } @Override protected void onStart() { super.onStart(); Log.d(TAG,"MainActivity onStart "); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "MainActivity onStop "); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "MainActivity onDestroy "); } @Override protected void onRestart() { super.onRestart(); Log.d(TAG, "MainActivity onRestart "); } }
package com.example.activitytest; import android.app.Activity; import android.os.Bundle; import android.util.Log; public class SecondActivity extends Activity { private static final String TAG = "ActivityTest"; @Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.second_layout); super.onCreate(savedInstanceState); Log.d(TAG,"SecondActivity onCreate"); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "SecondActivity onStart"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "SecondActivity onResume"); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "SecondActivity onPause"); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "SecondActivity onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "SecondActivity onDestroy"); } @Override protected void onRestart() { super.onRestart(); Log.d(TAG, "SecondActivity onRestart"); } }
1. 运行应用,MainActivity运行。
可以看出一个Activity运行调用的回调方法是: onCreate()->onStart()->onResume()
- 2. 点击跳转按钮,由MainActivity跳转到SecondActivity:
-
1>SecondActivity是Dialog。
-
-
由于SecondActivity是Dialog,所以MainActivity依然可见,所以只调用了它的onPause()方法。
-
2>若将SecondActivity改为不是Dialog(只需在Manifest.xml文件中删掉 android:theme="@android:style/Theme.Dialog"这一行即可)
再点击跳转按钮:
-
-
对于MainActivity,由于不可见,状态由运行变为停止。
依次调用了它的回调方法: onPause()->onStop()
-
3.Activity处于运行状态时,点击返回按钮:
- 点击返回按钮,Activity由运行状态变为死亡状态,依次调用它的回调方法: onPause()->onStop()->onDestroy()
- 4.Activity处于运行状态,点击主页按钮,返回桌面:
- Activity由运行状态变为停止状态,依次调用它的回调方法: onPause()->onStop()
- 5.Activity处于停止状态,即由桌面返回到Activity:
- 停止->运行,依次调用回调方法:onRestart()->onStart()->onResume()
- 6.Activity处于运行状态,旋转屏幕:
- 可以看出,旋转屏幕是一个销毁Activity然后重新创建Activity的过程。
- 运行->暂停->停止->死亡->运行
- 依次调用回调方法:onPause()->onStop->onDestroy()->onCreate()->onStart()->onResume()
- 7.Activity处于运行状态,手机此时锁屏:
- 可以看出,手机锁屏,此时由于Activity不可见,会进入停止状态。
- 依次调用回调方法:onPause()->onStop()
- 8.当应用正在运行时,手机锁屏,然后解锁回到应用界面:
- 可以看出应用从停止状态恢复到运行状态。
- 依次调用回调方法:onRestart()->onStart()->onResume()
- 参考:http://www.cnblogs.com/JohnTsai/p/4052676.html
- http://www.cnblogs.com/hibraincol/archive/2012/03/06/2382120.html