1. 程式人生 > >Android---Activity

Android---Activity

返回結果 col ons lse pub ren final while find

  • activity的生命周期

  onCreate()

  您必須實現此回調,該回調在系統首次創建活動時觸發。在活動創建時,活動進入創建狀態。在onCreate()方法中,您執行基本的應用程序啟動邏輯,該邏輯在活動的整個生命周期中只應發生一次。例如,onCreate()的實現可能會將數據綁定到列表,將活動與ViewModel關聯,並實例化一些類範圍變量。此方法接收參數savedInstanceState,該參數是包含活動先前保存狀態的Bundle對象。如果活動以前從未存在過,則Bundle對象的值為null。以下onCreate()方法示例顯示了活動的基本設置,例如聲明用戶界面(在XML布局文件中定義),定義成員變量以及配置某些UI。在此示例中,通過將文件的資源ID R.layout.main_activity傳遞給setContentView()來指定XML布局文件。

 1 TextView mTextView;
 2 
 3 // some transient state for the activity instance
 4 String mGameState;
 5 
 6 @Override
 7 public void onCreate(Bundle savedInstanceState) {
 8     // call the super class onCreate to complete the creation of activity like
 9     // the view hierarchy
10     super.onCreate(savedInstanceState);
11 12 // recovering the instance state 13 if (savedInstanceState != null) { 14 mGameState = savedInstanceState.getString(GAME_STATE_KEY); 15 } 16 17 // set the user interface layout for this activity 18 // the layout file is defined in the project res/layout/main_activity.xml file
19 setContentView(R.layout.main_activity); 20 21 // initialize member TextView so we can manipulate it later 22 mTextView = (TextView) findViewById(R.id.text_view); 23 } 24 25 // This callback is called only when there is a saved instance that is previously saved by using 26 // onSaveInstanceState(). We restore some state in onCreate(), while we can optionally restore 27 // other state here, possibly usable after onStart() has completed. 28 // The savedInstanceState Bundle is same as the one used in onCreate(). 29 @Override 30 public void onRestoreInstanceState(Bundle savedInstanceState) { 31 mTextView.setText(savedInstanceState.getString(TEXT_VIEW_KEY)); 32 } 33 34 // invoked when the activity may be temporarily destroyed, save the instance state here 35 @Override 36 public void onSaveInstanceState(Bundle outState) { 37 outState.putString(GAME_STATE_KEY, mGameState); 38 outState.putString(TEXT_VIEW_KEY, mTextView.getText()); 39 40 // call superclass to save any view hierarchy 41 super.onSaveInstanceState(outState); 42 }

  onStart()

  當onCreate()退出時,活動進入Started狀態,活動對用戶可見。 這個回調包含了活動最終準備到達前臺並變得互動的內容。

  onResume()

  系統在活動開始與用戶交互之前調用此回調。 此時,活動位於活動堆棧的頂部,並捕獲所有用戶輸入。 應用程序的大多數核心功能都是在onResume()方法中實現的。onPause()回調始終跟在onResume()之後。

  onPause()

  當活動失去焦點並進入暫停狀態時,系統調用onPause()。 例如,當用戶點擊“後退”或“最近”按鈕時,會出現此狀態。 當系統為您的活動調用onPause()時,它在技術上意味著您的活動仍然部分可見,但大多數情況下表明用戶正在離開活動,並且活動很快將進入“已停止”或“已恢復”狀態。如果用戶期望UI更新,則處於暫停狀態的活動可以繼續更新UI。 這種活動的示例包括示出導航地圖屏幕或媒體播放器播放的活動。 即使這些活動失去焦點,用戶也希望他們的UI繼續更新。您不應使用onPause()來保存應用程序或用戶數據,進行網絡調用或執行數據庫事務。一旦onPause()完成執行,下一個回調就是onStop()或onResume(),具體取決於活動進入Paused狀態後會發生什麽。

  onStop()

  當活動不再對用戶可見時,系統調用onStop()。 這可能是因為活動被破壞,新活動正在開始,或者現有活動正在進入恢復狀態並且正在覆蓋已停止的活動。 在所有這些情況下,停止的活動根本不再可見。系統調用的下一個回調是onRestart(),如果活動返回與用戶交互,或者如果此活動完全終止,則由onDestroy()調用。應該使用onStop()執行相對CPU密集型的關閉操作。例如,如果找不到更合適的時間將信息保存到數據庫,則可以在onStop()期間執行此操作。

  onRestart()

  當處於“已停止”狀態的活動即將重新啟動時,系統將調用此回調。 onRestart()從停止時恢復活動的狀態。此回調始終跟隨onStart()。

  onDestroy()

  系統在銷毀活動之前調用此回調。此回調是活動收到的最後一個回調。 通常實現onDestroy()以確保在活動或包含它的進程被銷毀時釋放所有活動的資源。

技術分享圖片

  • 保存和恢復瞬態UI狀態

  當活動因系統限制而被銷毀時,您應該使用ViewModel,onSaveInstanceState()和/或本地存儲的組合來保留用戶的瞬態UI狀態。本節概述了實例狀態以及如何實現onSaveInstance()方法,該方法是對活動本身的回調。如果您的UI數據簡單而輕量級,例如原始數據類型或簡單對象(如String),則可以單獨使用onSaveInstanceState()來保持UI狀態跨越配置更改和系統啟動的進程死亡。但是,在大多數情況下,您應該使用ViewMode onSaveInstanceState()(如保存UI狀態中所述),因為onSaveInstanceState()會導致序列化/反序列化的成本。

  使用onSaveInstanceState()保存簡單,輕量級的UI狀態當您的活動開始停止時,系統會調用onSaveInstanceState()方法,以便您的活動可以將狀態信息保存到實例狀態包。此方法的默認實現保存有關活動視圖層次結構狀態的瞬態信息,例如EditText小部件中的文本或ListView小部件的滾動位置。要為活動保存其他實例狀態信息,必須覆蓋onSaveInstanceState()並將鍵值對添加到在活動意外銷毀時保存的Bundle對象。如果重寫onSaveInstanceState(),則必須調用超類實現,如果希望默認實現保存視圖層次結構的狀態。例如:

 1 static final String STATE_SCORE = "playerScore";
 2 static final String STATE_LEVEL = "playerLevel";
 3 // ...
 4 
 5 
 6 @Override
 7 public void onSaveInstanceState(Bundle savedInstanceState) {
 8     // Save the user‘s current game state
 9     savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
10     savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
11 
12     // Always call the superclass so it can save the view hierarchy state
13     super.onSaveInstanceState(savedInstanceState);
14 }

  註意:當用戶顯式關閉活動時或在調用finish()的其他情況下,不會調用onSaveInstanceState()。但可以在輪換或切換到多窗口模式下使用。

  • 使用已保存的實例狀態還原活動UI狀態

  在先前銷毀活動後重新創建活動時,可以從系統傳遞給活動的Bundle中恢復已保存的實例狀態。 onCreate()和onRestoreInstanceState()回調方法都接收包含實例狀態信息的相同Bundle。因為無論系統是創建活動的新實例還是重新創建前一個實例,都會調用onCreate()方法,因此在嘗試讀取之前必須檢查狀態Bundle是否為null。 如果它為null,則系統正在創建活動的新實例,而不是恢復已銷毀的先前實例。例如,以下代碼段顯示了如何在onCreate()中恢復某些狀態數據:

 1 @Override
 2 protected void onCreate(Bundle savedInstanceState) {
 3     super.onCreate(savedInstanceState); // Always call the superclass first
 4 
 5     // Check whether we‘re recreating a previously destroyed instance
 6     if (savedInstanceState != null) {
 7         // Restore value of members from saved state
 8         mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
 9         mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
10     } else {
11         // Probably initialize members with default values for a new instance
12     }
13     // ...
14 }

  您可以選擇實現onRestoreInstanceState(),系統在onStart()方法之後調用而不是在onCreate()期間恢復狀態。 僅當存在要恢復的已保存狀態時,系統才會調用onRestoreInstanceState(),因此您無需檢查Bundle是否為null:

1 public void onRestoreInstanceState(Bundle savedInstanceState) {
2     // Always call the superclass so it can restore the view hierarchy
3     super.onRestoreInstanceState(savedInstanceState);
4 
5     // Restore state members from saved instance
6     mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
7     mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
8 }
  • 從一個活動啟動另一個活動

  1、starttActivity()

  如果新啟動的活動不需要返回結果,則當前活動可以通過調用startActivity()方法啟動它。

1 Intent intent = new Intent(this, SignInActivity.class);

2 startActivity(intent);

  2、應用程序啟動自己沒有的活動,可以利用設備上其他應用程序提供的活動。您可以創建描述您要執行的操作的意圖,系統從另一個應用程序啟動相應的活動。 如果有多個活動可以處理意圖,那麽用戶可以選擇使用哪個活動。 例如,如果要允許用戶發送電子郵件,可以創建以下意圖:

1 Intent intent = new Intent(Intent.ACTION_SEND);

2 intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);

3 startActivity(intent);

  3、startActivityForResult()

  有時您希望在活動結束時從結果中獲取結果。例如,您可以啟動一項活動,讓用戶在聯系人列表中選擇一個人;當它結束時,它返回被選中的人。為此,請調用startActivityForResult(Intent,int)方法,其中integer參數標識調用。此標識符用於消除來自同一活動的多次startActivityForResult(Intent,int)調用之間的歧義。它不是全局標識符,不存在與其他應用程序或活動沖突的風險。結果通過onActivityResult(int,int,Intent)方法返回。當子活動退出時,它可以調用setResult(int)將數據返回到其父級。子活動必須始終提供結果代碼,該結果代碼可以是標準結果RESULT_CANCELEDRESULT_OK或從RESULT_FIRST_USER開始的任何自定義值。此外,子活動可以選擇返回包含所需的任何其他數據的Intent對象。父活動使用onActivityResult(int,int,Intent)方法以及父活動最初提供的整數標識符來接收信息。如果子活動因任何原因(例如崩潰)失敗,則父活動將收到代RESULT_CANCELED的結果。

 1 public class MyActivity extends Activity {
 2      // ...
 3 
 4      static final int PICK_CONTACT_REQUEST = 0;
 5 
 6      public boolean onKeyDown(int keyCode, KeyEvent event) {
 7          if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
 8              // When the user center presses, let them pick a contact.
 9              startActivityForResult(
10                  new Intent(Intent.ACTION_PICK,
11                  new Uri("content://contacts")),
12                  PICK_CONTACT_REQUEST);
13             return true;
14          }
15          return false;
16      }
17 
18      protected void onActivityResult(int requestCode, int resultCode,
19              Intent data) {
20          if (requestCode == PICK_CONTACT_REQUEST) {
21              if (resultCode == RESULT_OK) {
22                  // A contact was picked.  Here we will just display it
23                  // to the user.
24                  startActivity(new Intent(Intent.ACTION_VIEW, data));
25              }
26          }
27      }
28  }

Android---Activity