天天看點

activty棧管理

題外話:我們有時在開發中,通常會有如下的需求:螢幕1-->螢幕2-->螢幕3-->螢幕4...,現在需要直接從螢幕4-->螢幕1,很多人會想到對activity進行管理得到對應的id什麼的,我這裡說一個方法,在轉到螢幕4之前将螢幕2和3關閉,那麼就可以實作我們的需求了,下面是具體的實作

我們要在進行blackberry程式開發的時候,blackberry提供了一個管理screen的棧,用來從任何地方來關閉位于最上一層的screen,使用uiapplication.getuiapplication().getactivescreen()來得到位于最上一層的screen的執行個體,并且使用uiapplication.getuiapplication().popscreen()來關閉一個screen或關閉目前最上一層的screen,但是android卻未提供相應的功能,隻能在一個activity的對象裡面調用finish來關閉自己,不能關閉其他的activity。比如我們想實作一個功能從螢幕a—>螢幕b—>螢幕c—>螢幕d,然後在在轉到螢幕d之前将螢幕b和c關閉,在螢幕b和螢幕c界面點選會退按鈕都可以回退到上一個螢幕,但是在螢幕d上點選會退按鈕讓其回退到a,此外在一些循環跳轉的界面上如果不在合适的地方将一些不需要的螢幕關閉,那麼經過多次跳轉後回導緻記憶體溢出。對此我們可以設計一個全局的activity棧,使用這個棧來管理activity。管理activity的類的定義如下:

java代碼:

import java.util.stack;

import android.app.activity;

public class screenmanager {

private static stack<activity> activitystack;

private static screenmanager instance;

private screenmanager(){

}

public static screenmanager getscreenmanager(){

if(instance==null){

instance=new screenmanager();

return instance;

public void popactivity(){

activity activity=activitystack.lastelement();

if(activity!=null){

activity.finish();

activity=null;

public void popactivity(activity activity){

activitystack.remove(activity);

public activity currentactivity(){

return activity;

public void pushactivity(activity activity){

if(activitystack==null){

activitystack=new stack<activity>();

activitystack.add(activity);

public void popallactivityexceptone(class cls){

while(true){

activity activity=currentactivity();

if(activity==null){

break;

if(activity.getclass().equals(cls) ){

popactivity(activity);

複制代碼

                stack<activity>這個就是我們自定義的activity棧,這個寫好後,我們就開始一步一步的來實作我們要跳轉的界面了。用了這個stack<activity>就給我們節省很多的資源和時間,有了這個我們頁就不用那麼麻煩了               

                 從上面的代碼我們知道了在每個方法的下面都會用到判斷,這個是非常主要的,因為當我們判斷完事了,才可以執行下面的代碼,就像是我們要跳轉界面一樣,我們這個跳轉的話,是必須你同意才能跳轉的,如果沒有判斷的話,當你到達這個界面的時候,就不會停止在這個界面,而是再跳到下一個界面,這樣就會出現bug。是以大家一定要記住這個。

繼續閱讀