編輯:關於Android編程
可能很多人會感覺Activity很簡單,但是經歷了半年的android開發,我發現我對Activity的的理解還是比較淺顯的,其實Activity並沒有我們想象的那麼簡單今天花了一個下午學習了Activity的生命周期,為以後忘記後迅速回顧,做准備。
一、首先看下官網給出activity的生命周期圖
實例代碼:
package com.example.activitypractice; import android.app.Activity; import android.content.Intent; import android.content.res.Configuration; 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 static final String TAG = MainActivity; private Button btn_jump; private String saveData= 存放的數據 ; //Activity創建時調用 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout. activity_main); btn_jump=(Button) findViewById(R.id. btn_jump); btn_jump.setOnClickListener( new OnClickListener() { public void onClick(View v) { Intent intent= new Intent(MainActivity.this,JumpToActivity.class ); startActivity(intent); } }); Log. i(TAG,執行了onCreate方法 ); } //Activity創建或者從後台重新回到前台時被調用 @Override protected void onStart() { super.onStart(); Log. i(TAG,執行了onStart方法 ); } //Activity從後台重新回到前台時被調用 @Override protected void onRestart() { super.onRestart(); Log. i(TAG,執行了onRestart方法 ); } //Activity創建或者從被覆蓋、後台重新回到前台時被調用 @Override protected void onResume() { super.onResume(); Log. i(TAG,執行了onResume方法 ); } //Activity被覆蓋到下面或者鎖屏時被調用 @Override protected void onPause() { super.onPause(); Log. i(TAG,執行了onPause方法 ); } //退出當前Activity或者跳轉到新Activity時被調用 @Override protected void onStop() { super.onStop(); Log. i(TAG,執行了onStop方法 ); } //退出當前Activity時被調用,調用之後Activity就結束了 @Override protected void onDestroy() { super.onDestroy(); Log. i(TAG,執行了onDestroy方法 ); } //Activity窗口獲得或失去焦點時被調用,在onResume之後或onPause之後 /* @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); Log.i(TAG, onWindowFocusChanged called.); } */ /** * Activity被系統殺死時被調用. * 例如:屏幕方向改變時,Activity被銷毀再重建;當前Activity處於後台,系統資源緊張將其殺死. * 另外,當跳轉到其他Activity或者按Home鍵回到主屏時該方法也會被調用,系統是為了保存當前View組件的狀態. * 在onPause之前被調用. */ @Override protected void onSaveInstanceState(Bundle outState) { outState.putString( key, saveData); Log. i(TAG, onSaveInstanceState called.put saveData: + saveData ); super.onSaveInstanceState(outState); } /** * Activity被系統殺死後再重建時被調用. * 例如:屏幕方向改變時,Activity被銷毀再重建;當前Activity處於後台,系統資源緊張將其殺死,用戶又啟動該Activity. * 這兩種情況下onRestoreInstanceState都會被調用,在onStart之後. */ @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { String getData = savedInstanceState.getString( key); Log. i(TAG, onRestoreInstacedState called.getData: +getData); super.onRestoreInstanceState(savedInstanceState); } }
在上面的例子中我們可以看到還有三個不是特別常見的方法,onWindowFocusChanged、onSaveInstanceState、onRestoreInstanceState方法這三個方法我們用的比較少下面也來說說它們的用法: (1)onWindowFocusChanaged方法 在Activity窗口獲得或失去焦點時調用,例如創建時首次展示在用戶面前、當Activity被其它Activity所覆蓋、Activity退到後台、用戶退出當前Activity,這幾種條件都會調用onWindowFocusChanaged,並且當Activity被創建時是在onResume之後被調用,當Activity被覆蓋或者退到後台或當前Activity退出時它是在onPause之後被調用的,如下圖Activity啟動之後被其它的activity覆蓋(點擊我們的跳轉按鈕)打印的日志
(2)onSaveInstanceState: 1.在Activity被覆蓋或者退到後台之後,系統資源不足,將其殺死,此方法會被調用; 2.在用戶改變屏幕方向時此方法會被調用; 3.在當前Activity跳轉到其他Activity或者按Home鍵回到主屏,自身退到後台時,此方法會被調用。 第一種情況我們無法保證什麼時候發生,系統根據資源的緊張程度去調度;第二種是屏幕翻轉方向時,系統先銷毀當前Activity,然後再重建一個新的,調用此方法時,我們可以保存一些臨時數據,例如:當豎屏時加載一個進度條,切換到橫屏時如果不保存當前加載到多少橫屏時會重0開始,保存後就可以繼續加載,第三種情況系統調用此方法是為了保存當前窗口各個View組件的狀態。onSaveInstanceState的調用順序是在onPause之後,如下圖是在跳轉到其它的Activity所執行的方法
package com.example.activitypractice; import android.app.Activity; import android.content.Intent; import android.content.res.Configuration; 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 static final String TAG = MainActivity; private Button btn_jump; private String saveData= 存放的數據 ; //Activity創建時調用 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout. activity_main); btn_jump=(Button) findViewById(R.id. btn_jump); btn_jump.setOnClickListener( new OnClickListener() { public void onClick(View v) { Intent intent= new Intent(MainActivity.this,JumpToActivity.class ); startActivity(intent); } }); Log. i(TAG,執行了onCreate方法 ); } //Activity創建或者從後台重新回到前台時被調用 @Override protected void onStart() { super.onStart(); Log. i(TAG,執行了onStart方法 ); } //Activity從後台重新回到前台時被調用 @Override protected void onRestart() { super.onRestart(); Log. i(TAG,執行了onRestart方法 ); } //Activity創建或者從被覆蓋、後台重新回到前台時被調用 @Override protected void onResume() { super.onResume(); Log. i(TAG,執行了onResume方法 ); } //Activity被覆蓋到下面或者鎖屏時被調用 @Override protected void onPause() { super.onPause(); Log. i(TAG,執行了onPause方法 ); } //退出當前Activity或者跳轉到新Activity時被調用 @Override protected void onStop() { super.onStop(); Log. i(TAG,執行了onStop方法 ); } //退出當前Activity時被調用,調用之後Activity就結束了 @Override protected void onDestroy() { super.onDestroy(); Log. i(TAG,執行了onDestroy方法 ); } /** * Activity被系統殺死時被調用. * 例如:屏幕方向改變時,Activity被銷毀再重建;當前Activity處於後台,系統資源緊張將其殺死. * 另外,當跳轉到其他Activity或者按Home鍵回到主屏時該方法也會被調用,系統是為了保存當前View組件的狀態. * 在onPause之前被調用. */ @Override protected void onSaveInstanceState(Bundle outState) { outState.putString( key, saveData); Log. i(TAG, onSaveInstanceState called.put saveData: + saveData ); super.onSaveInstanceState(outState); } /** * Activity被系統殺死後再重建時被調用. * 例如:屏幕方向改變時,Activity被銷毀再重建;當前Activity處於後台,系統資源緊張將其殺死,用戶又啟動該Activity. * 這兩種情況下onRestoreInstanceState都會被調用,在onStart之後. */ @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { String getData = savedInstanceState.getString( key); Log. i(TAG, onRestoreInstacedState called.getData: +getData); super.onRestoreInstanceState(savedInstanceState); } //當指定了android:configChanges=orientation後,方向改變時onConfigurationChanged被調用,並且activity不再銷毀重建 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); switch (newConfig. orientation) { case Configuration. ORIENTATION_PORTRAIT://豎屏 Log. i(TAG,豎屏 ); setContentView(R.layout. portrait); break; case Configuration. ORIENTATION_LANDSCAPE://橫屏 Log. i(TAG,橫屏 ); setContentView(R.layout. landscap); default: break; } } }需要注意的是我們必須在手機上設置(注意:要在設置中設置自動旋轉屏幕我用的三星的測試機是在設定-->我的設備-->顯示 在顯示裡有自動旋轉屏幕選項)自動旋轉屏幕才可以 然後當我們旋轉屏幕時,我們會看到Activity首先會銷毀然後重建,系統會調用onSaveInstanceState方法並在Bundle對象中保存了一個臨時的數據,當Activity銷毀後再重建時調用onRestoreInstancedState方法我們從中可以把保存的數據取出來日志如下:
為了在 Android 應用中錄制聲音,Android提供了 MediaRecorder 類,關於MediaRecorder的詳解大家可以參考《Android開發之Med
先看看效果,如圖:1.因為TabLayout是Android Design Support Library官方庫的一個控件,所以使用TabLayout時候需要先添加對該庫
文字說明都在代碼和圖片上了。唯一要注意的是,Json或者圖片等工程類包,需要自己去官網下載~~另外,這邊還用到一個Google的注解jar包~~ &
在開發中UI布局是我們都會遇到的問題,隨著UI越來越多,布局的重復性、復雜度也會隨之增長。Android官方給了幾個優化的方法,但是網絡上的資料基本上都是對官方資料的翻