Android學習之Activity深入

來源:互聯網
上載者:User

標籤:

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

<application Android:allowBackup="true"Android:icon="@mipmap/ic_launcher" Android:label="@string/app_name" Android:supportsRtl="true" Android:theme="@style/AppTheme">

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

<!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item><item name="Android:windowAnimationStyle">@style/activityAnim</item>
</style><!-- 使用style方式定義activity切換動畫 --> <style name="activityAnim"> <item name="Android:activityOpenEnterAnimation">@anim/slide_in_top</item> <item name="Android:activityOpenExitAnimation">@anim/slide_in_top</item> </style>

而在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。

<explode xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:duration="300" />

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

<!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item><item name="Android:windowEnterTransition">@transition/activity_explode</item><item name="Android:windowExitTransition">@transition/activity_explode</item> </style>

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

<item name="Android:windowEnterTransition">@transition/activity_explode</item><item name="Android:windowExitTransition">@transition/activity_explode</item>

(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屬性:

<Button Android:id="@+id/button5" Android:layout_width="match_parent" Android:layout_height="wrap_content" Android:layout_below="@+id/button4" Android:layout_marginTop="10dp" Android:layout_marginRight="10dp" Android:layout_marginLeft="10dp" Android:text="組件過度動畫" Android:background="@color/colorPrimary" Android:transitionName="shareNames" />

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

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:id="@+id/activity_second" Android:layout_width="match_parent" Android:layout_height="match_parent" Android:gravity="center_horizontal" Android:orientation="vertical" Android:transitionName="shareNames" > <TextView Android:layout_width="match_parent" Android:layout_height="match_parent" Android:background="@color/colorAccent" Android:layout_marginTop="10dp" Android:layout_marginBottom="10dp" /></LinearLayout>

(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代碼中設定的是局部動畫

參考文章
http://www.jianshu.com/p/c21216bf5f82
http://www.cnblogs.com/bavariama/p/3368515.html

Android學習之Activity深入

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.