Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Activity的生命周期

Activity的生命周期

編輯:關於Android編程

Activity的生命周期

1. 從打開應用到按後退鍵

打開應用

onCreate() 方法執行! 不可見

onStart() 方法執行! 可見

onResume() 方法執行! 可見&在前台

按下後退鍵

onPause() 方法執行! 可見

onStop() 方法執行! 不可見

onDestroy() 方法執行!不可見

2. 從打開應用到按主屏幕鍵 再到重新打開應用

打開應用

onCreate() 方法執行!

onStart() 方法執行!

onResume() 方法執行!

按下主屏幕鍵

onPause() 方法執行!

onStop() 方法執行!

重新打開應用

onRestart() 方法執行!

onStart() 方法執行!

onResume() 方法執行!

 

\

 

Activity在onPause() 和 onStop()後都可能由於內存不足等原因被殺死從而當用戶重新打開app時會重新執行onCreat()方法。 onPause()方法在app被其他app覆蓋時會執行,如果短時間內重新回到前面,則會執行onResume()方法。如果長時間不可見的話則會執行onStop()方法。

3. 橫豎屏切換問題

通過橫豎屏切換時發現,Activity的生命周期的變化如下:

onPause() 方法執行!

onStop() 方法執行!

onDestroy() 方法執行!

onCreate() 方法執行!

onStart() 方法執行!

onResume() 方法執行!

是把當前的Activity銷毀後重新創建

在res目錄下新建layout-land文件夾,裡面放的是Activity橫屏時顯示的布局,名字要與layout文件夾下的文件名字一樣。

設備旋轉前保存數據:

重載onSaveInstanceState()方法

onPause() 方法執行!

onStop() 方法執行!

onSavaInstanceState(Bundle) 方法執行

onDestroy() 方法執行!

onCreate() 方法執行!

onStart() 方法執行!

onResume() 方法執行!

方法onSavaInstanceState()默認的實現要求所有activity的視圖將自身狀態數據保存在Bundle對象中。在重新執行onCreat()方法時會傳入Bundle對象。

onCreate() 方法執行! /**首次打開app**/

Bundle對象為空

onStart() 方法執行!

onResume() 方法執行!

onPause() 方法執行! /**旋轉手機屏幕**/

onSaveInstanceState() 方法執行!

onStop() 方法執行!

onDestroy() 方法執行!

onCreate() 方法執行!

Bundle對象獲取到的myInfo的值:hahaha

onStart() 方法執行!

onResume() 方法執行!

當旋轉手機屏幕並重新執行onCreat()方法後在onSaveInstanceState()中向Bundle保存的值傳了過去。

那麼有個問題,onSaveInstanceState()這個方法什麼時候會執行?一定會在onPause()和onStop()之間執行麼?

答案:onSaveInstanceState()這個方法不一定都會執行,當用戶按下後退鍵時,代表了不再需要這個Activity了,這時候就沒有必要執行這個方法了。但是,如果用戶按下主屏幕鍵或者這個Activity轉為後台運行時,這個時候需要保存信息,這個方法會執行。

onRestart() 方法執行! /**打開app**/

onStart() 方法執行!

onResume() 方法執行!

onPause() 方法執行! /**按下後退鍵**/

onStop() 方法執行!

onDestroy() 方法執行!

onCreate() 方法執行! /**打開app**/

Bundle對象為空

onStart() 方法執行!

onResume() 方法執行!

onPause() 方法執行! /**按下主屏幕鍵**/

onSaveInstanceState() 方法執行!

onStop() 方法執行!

用戶離開當前activity管理的用戶界面,或Android需要回收內存時,activity也會被銷毀。

不過Android從不會為了回收內存而去銷毀正在運行的activity。activity只有在暫停或者停止狀態下才可能被銷毀。此時就會調用onSaveInstanceState()方法。

調用這個方法時,用戶數據會被保存在Bundle對象中。然後操作系統將Bundle對象放入activity記錄中。

activity暫存後,Activity對象不再存在,但操作系統會將activity記錄保存起來。在需要回復activity時,操作系統可以使用暫存的activity記錄重新激活activity。

常見的做法是覆蓋onSaveInstanceState()方法把數據保存在Bundle對象中,覆蓋onPause()方法處理其他需要處理的事情。

那麼暫存的activity記錄可以保存多久?用戶按下後退鍵後,系統會徹底銷毀當前的activity。activity記錄也會被清除。系統重啟或長時間不適用這個activity時,記錄也會被刪除。

測試代碼:

package com.ashzheng.helloandroid;

import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Log.d("info", "onCreate() 方法執行!");

if(null != savedInstanceState){

Log.d("info", "Bundle對象獲取到的myInfo的值:" + savedInstanceState.getString("myInfo"));

}else{

Log.d("info", "Bundle對象為空");

}

}

@Override

protected void onDestroy() {

super.onDestroy();

Log.d("info", "onDestroy() 方法執行!");

}

@Override

protected void onPause() {

super.onPause();

Log.d("info", "onPause() 方法執行!");

}

@Override

protected void onRestart() {

super.onRestart();

Log.d("info", "onRestart() 方法執行!");

}

@Override

protected void onStart() {

super.onStart();

Log.d("info", "onStart() 方法執行!");

}

@Override

protected void onStop() {

super.onStop();

Log.d("info", "onStop() 方法執行!");

}

@Override

protected void onResume() {

super.onResume();

Log.d("info", "onResume() 方法執行!");

}

@Override

protected void onSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

outState.putString("myInfo", "hahaha");

Log.d("info", "onSaveInstanceState() 方法執行!");

}

}

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved