Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android學習之Activity深入

Android學習之Activity深入

編輯:關於Android編程

activitiy中打開一個Aactivitiy,Aactivitiy會走以下生命周期
onCreate–》onStart–》onResume–》A運行–》發出打開B的intent–》AonPause–》B可見–》AonStop,此時B經歷同樣的生命周期,
等B結束,A再度可見,onRestart–》onStart–》onResume

注意:AonPause之後B可見,為了不影響B界面的顯示,這裡最好不要在A的onPause中做耗時操作,耗時操作可以在onPause中操作,因為此時B已經可見。

一,異常情況下的生命周期

1,資源相關的系統配置發生改變
比如橫豎屏切換,系統資源配置發生了改變,activity會被摧毀並重新創建,因為是異常終止,activity會使用saveInstanceState方法來保存狀態,這個方法在onStop之前,與onPause沒有時序關系,當activitiy重建時,系統會把saveInstanceState保存下來的Bundle對象傳遞給onRestoreInstanceState和onCreate方法,

2,系統內存不足導致低優先級activity被殺死
activity優先級
1,處於前台與用戶交互的activitiy優先級最高,
2,可見但非前台居中,比如彈出的dialog或者顯示的progress使activity無法與用戶交互,但此時activity仍然可見
3,位於後台失去焦點,此時activity處於onStop狀態,優先級最低。
當系統資源不足時,會優先殺死優先級低的activity,由於是異常終止,系統會調用saveInstanceSate和onRestoreInstanceState兩個方法來保存和恢復數據

二,Activity過渡的五中實現
1.使用overridePendingTransition方法實現Activity跳轉動畫
overridePendingTransition方法是Activity中提供的Activity跳轉動畫方法,通過該方法可以實現Activity跳轉時的動畫效果
比如:
Intent intent =newIntent(MainActivity.this, SecondActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.slide_in_left, R.anim.slide_in_left);
這個函數有兩個參數,一個參數是第一個activity進入時的動畫,另外一個參數則是第二個activity退出時的動畫。

這裡需要特別說明的是,關於overridePendingTransition這個函數,有兩點需要主意
1>.它必需緊挨著startActivity()或者finish()函數之後調用”
2>.它只在android2.0以及以上版本上適用

2、使用style的方式定義Activity的切換動畫
(1)定義Application的theme給主題定義style


(2)定義具體的AppTheme樣式
其中這裡的windowAnimationStyle就是我們定義Activity切換動畫的style。而@anim/slide_in_top就是我們定義的動畫文件,也就是說通過為Appliation設置style,然後為windowAnimationStyle設置動畫文件就可以全局的為Activity的跳轉配置動畫效果。

而在windowAnimationStyle中存在四種動畫:

activityOpenEnterAnimation
用於設置打開新的Activity並進入新的Activity展示的動畫
activityOpenExitAnimation
用於設置打開新的Activity並銷毀之前的Activity展示的動畫
activityCloseEnterAnimation
用於設置關閉當前Activity進入上一個Activity展示的動畫
activityCloseExitAnimation
用於設置關閉當前Activity時展示的動畫

案列中只做了兩種動畫

3.使用ActivityOptions切換動畫實現Activity跳轉動畫

通過overridePendingTransition方法基本上可以滿足我們日常中對Activity跳轉動畫的需求了,但MD風格出來之後,overridePendingTransition這種老舊、生硬的方式怎麼能適合我們的MD風格的App呢?ActivityOptions是google在新的sdk中給我們提供了另外一種Activity的過度動畫。並且提供了兼容包——ActivityOptionsCompat。ActivityOptionsCompat是一個靜態類,提供了相應的Activity跳轉動畫效果,通過其可以實現不少炫酷的動畫效果。
(1)在跳轉的Activity中設置contentFeature

@Override protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
// 設置contentFeature,可使用切換動畫 
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); 
Transition explode = TransitionInflater.from(this).inflateTransition(Android.R.transition.explode);
getWindow().setEnterTransition(explode); 
setContentView(R.layout.activity_three); }

(2)在startActivity執行跳轉邏輯的時候調用startActivity的重寫方法,執行ActivityOptions.makeSceneTransitionAnimation方法

/** * 點擊按鈕,實現Activity的跳轉操作 * 通過Android5.0及以上代碼的方式實現activity的跳轉動畫 */
button3.setOnClickListener(new View.OnClickListener() { 
@Override public void onClick(View v) { 
Intent intent = new Intent(MainActivity.this, ThreeActivity.class); 
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle()); } });

4,使用ActivityOptions之後內置的動畫效果通過style的方式
這種方式其實就是通過style的方式展示和使用ActivityOptions過度動畫,下面是實現通過定義style方式定義過度動畫的步驟:
(1)編寫過度動畫文件

首先我們需要在Application項目res目錄下新建一個transition目錄,然後創建資源文件,然後使用這些系統自帶的過渡動畫效果,這裡設置了過度時長為300ms。


(2)定義style文件,把translation目錄下定義好的資源引用進來

在Application的style文件中添加,並指定過渡動畫效果為我們剛剛定義的過渡動畫文件:

@transition/activity_explode
@transition/activity_explode

(3)執行跳轉邏輯
點擊按鈕,實現Activity的跳轉操作 * 通過Android5.0及以上style的方式實現activity的跳轉動畫

button4.setOnClickListener(new View.OnClickListener() 
{ @Override public void onClick(View v) {
 /** * 調用ActivityOptions.makeSceneTransitionAnimation實現過度動畫 */ 
Intent intent = new Intent(MainActivity.this, FourActivity.class); 
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle()); 
}
 });

(五)使用ActivityOptions動畫共享組件的方式實現跳轉Activity動畫
這裡的共享組件動畫效果是指將前面一個Activity的某個子View與後面一個Activity的某個子View之間有過渡效果,即在這種過度效果下實現Activity的跳轉操作。那麼如何實現兩個組件View之間實現過渡效果呢?

(1)定義共享組件
在Activity a中的button按鈕點擊transitionName屬性:

在Activity b的布局文件中為組件定義transitionName屬性,這樣這兩個組件相當於有了過度對應關系,這裡需要注意的是這兩個組件的transitionName屬性的值必須是相同的。


 

(2)調用startActivity執行跳轉動畫
點擊按鈕,實現Activity的跳轉操作 * 通過Android5.0及以上共享組件的方式實現activity的跳轉動畫

button5.setOnClickListener(new View.OnClickListener() { 
@Override public void onClick(View v) { 
Intent intent = new Intent(MainActivity.this, FiveActivity.class); 
startActivity(intent, 
ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, button5, "shareNames").toBundle()); } 
});

需要說明的是這裡調用的ActivityOptions.makeSceneTransitionAnimation方法,傳遞了三個參數,其中第一個參數為context對象,第二個參數為啟動Activity的共享組件,第三個參數為啟動Activity的共享組件transitionName屬性值。
這樣經過調用之後我們就實現了從Activity a跳轉到Activity b的時候a中的組件到b中組件的過度效果。

過渡動畫總結

overridePendingTransition方法從Android2.0開始,基本上能夠覆蓋我們activity跳轉動畫的需求;

ActivityOptions API是在Android5.0開始的,可以實現一些炫酷的動畫效果,更加符合MD風格;ActivityOptions還可以實現兩個Activity組件之間的過度動畫;

定義Application style的動畫為全局動畫,而在java代碼中設置的是局部動畫

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