Android:實現兩個Activity相互切換而都不走onCreate().(程式更加流暢!)

來源:互聯網
上載者:User

標籤:android開發   activity   intent   

本文要實現的目的是:

有3個Activity: A,B,C,從A中可以進入B,B中可以進入C,並且B和C之間可能需要多次相互切換,因此不能使用普通的startActivity-finish方式,因為重新建立Activity比較耗時。當這個Activity內容比較多時,重複建立很大的影響了流暢性。(即實作類別似於QQ上 選擇照片頁面-選擇相簿頁面,這兩個頁面可能多次相互切換,所以不能多次建立)

1.從B進入C或者從C進入B時,均使用startActivity的方式(不使用finish),並為intent添加參數FLAG_ACTIVITY_REORDER_TO_FRONT,即:

Intent intent = new Intent(B.this, C.class);intent.addFlags(Intent.FLAG_ACTIVITY__TO_FRONT);startActivity(intent);
在這種情況下,如果C之前沒有建立則會被建立,如果已經建立了,則只會把C從Aciticy棧中搬到B的上面來,而不再重新建立。

2.在C中重寫onNewIntent方法,即:

@Override    protected void onNewIntent(Intent intent) {        super.onNewIntent(intent);    }
該方法中的參數intent即為從B到C時startActivity的intent,在第二次進入C時,可以在此方法中根據從B中傳過來的資料更新C的頁面。(第一次進入C時走onCreate,不會走onNewIntent)

3.在B中也重寫onNewIntent,和上述2相同。

4.在A和B中使用某個按鈕或返回鍵回到最開始的頁面A時,同樣使用startActivity的方式,並為intent添加參數FLAG_ACTIVITY_CLEAR_TOP,這樣B和C都會被關閉(finish)

Intent intent = new Intent(this, A.class);        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);        startActivity(intent);

5.同樣,在A中重寫onNewIntent方法,處理B或C返回時傳遞的資訊。並且,在Manifest中為A添加屬性android:launchMode="singleTop"

6.最後一個問題,由於從B到C和從C到B都使用的是startActivity的方式,因此Activity之間切換的動畫都是 開啟新Activity 的樣式。例如,無論從B到C或者從C到B,新頁面都是從右側進入,給人的感覺似乎一直在建立新Activity,很不友好。

解決這個問題的方法是自訂Activity之間切換的動畫,目的是給使用者一種感覺:從C到B的時候是新開Activity(B從右側進入),而從B到C的時候是“返回”(C從左側進入)。只需一行代碼:

overridePendingTransition(in, out);
in:進入的Activity的動畫; out:退出的Activity的動畫。

這裡需要注意:

(1)對於普通的startActivity-finish方式,如果需要自訂Activity之間切換的動畫,只需將上述代碼寫在startActivity或finish之後即可:

(2)但是,本文中由於使用了FLAG_ACTIVITY_REORDER_TO_FRONT的方式,上述動畫將只在第一次建立頁面B或C的時候有效。解決方案是,將上述代碼寫在onNewIntent中。例如從B到C,則在C中onNewIntent中寫上這行代碼,指定C進入的樣式和B退出的樣式。

7.動畫資源:

(1)Activity從左側退出:

<?xml version="1.0" encoding="utf-8"?><translate xmlns:android="http://schemas.android.com/apk/res/android"    android:duration="150"    android:fromXDelta="0"    android:toXDelta="-100%p"    android:fromYDelta="0"    android:toYDelta="0" ></translate>

(2)Activity從右側退出:

<?xml version="1.0" encoding="utf-8"?><translate xmlns:android="http://schemas.android.com/apk/res/android"    android:duration="150"    android:fromXDelta="0"    android:fromYDelta="0"    android:toXDelta="100%p"    android:toYDelta="0" ></translate>

(3)Activity從左側進入:

<?xml version="1.0" encoding="utf-8"?><translate xmlns:android="http://schemas.android.com/apk/res/android"    android:duration="150"    android:fromXDelta="-100%p"    android:fromYDelta="0"    android:toXDelta="0"    android:toYDelta="0" ></translate>

(4)Activity從右側進入:

<?xml version="1.0" encoding="utf-8"?><translate xmlns:android="http://schemas.android.com/apk/res/android"    android:duration="150"    android:fromXDelta="100%p"    android:toXDelta="0"    android:fromYDelta="0"    android:toYDelta="0" ></translate>

本文完。

下一篇文章中,將使用此種方式實現仿QQ照片選擇功能,盡情期待。



Android:實現兩個Activity相互切換而都不走onCreate().(程式更加流暢!)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.