編輯:關於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開發之使用MediaRecorder錄制聲音
為了在 Android 應用中錄制聲音,Android提供了 MediaRecorder 類,關於MediaRecorder的詳解大家可以參考《Android開發之Med
Android中TabLayout結合ViewPager實現頁面切換效果
先看看效果,如圖:1.因為TabLayout是Android Design Support Library官方庫的一個控件,所以使用TabLayout時候需要先添加對該庫
Android開發-Retrofit-AndroidStudio(二)Json
文字說明都在代碼和圖片上了。唯一要注意的是,Json或者圖片等工程類包,需要自己去官網下載~~另外,這邊還用到一個Google的注解jar包~~ &
Android布局優化之Merge、Include、ViewStub使用與源碼分析
在開發中UI布局是我們都會遇到的問題,隨著UI越來越多,布局的重復性、復雜度也會隨之增長。Android官方給了幾個優化的方法,但是網絡上的資料基本上都是對官方資料的翻