Android:實現兩個Activity相互切換而都不走onCreate()


本文要實現的目的是:

有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中使用某個button或返回鍵回到最開始的頁面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照片選擇功能,盡情期待。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM