標籤:5.0 android 一個 回調 col ext etc src print
問題描述:假設當前Activity為A,如果這時使用者開啟一個新的Activity B,那麼B的onResume和A的onPause哪個先執行呢?
GitHub Demo
廢話少說,上代碼,Activity A :
public class AActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_a); } public void goToBActivity(View view) { startActivity(new Intent(this, BActivity.class)); } @Override protected void onPause() { super.onPause(); System.out.println("AActivity.onPause"); } @Override protected void onStop() { super.onStop(); System.out.println("AActivity.onStop"); }}
BActivity:
public class BActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_b); } @Override protected void onStart() { super.onStart(); System.out.println("BActivity.onStart"); } @Override protected void onResume() { super.onResume(); System.out.println("BActivity.onResume"); }}
Log:
03-31 17:08:56.144 4861-4861/com.art.exploration I/System.out: AActivity.onPause03-31 17:08:56.187 4861-4861/com.art.exploration I/System.out: BActivity.onStart03-31 17:08:56.189 4861-4861/com.art.exploration I/System.out: BActivity.onResume03-31 17:08:56.569 4861-4861/com.art.exploration I/System.out: AActivity.onStop
通過上述測試可以發現,在Android 5.0系統上,舊的AActivity的onPause先調用,然後新的BActivity才會啟動。
在Android Activity源碼中對onPause的解釋裡有這樣一句話:
When activity B is launched in front of activity A, this callback willbe invoked on A. B will not be created until A‘s {@link #onPause} returns,so be sure to not do anything lengthy here.
意思是當活動B在活動A前面啟動時,該回調將在A上被調用。在A的onPause返回之前,B不會被建立,所以請確保在這裡不做任何事情,及不能做耗時操作,會影響B的啟動。
通過分析這個問題,我們知道onPause和onStop都不能做耗時操作,尤其是onPause,也就是說盡量在onStop中操作,從而不影響新的Activity儘快顯示出來並切換到前台。
註:這篇部落格是筆者根據《Android開發藝術探索》一書案例做的實測,希望能協助到大家。
GitHub Demo
Android讀書筆記一:假設當前Activity為A,如果這時使用者開啟一個新的Activity B,那麼B的onResume和A的onPause哪個先執行呢?