閱讀195 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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代碼:

  1. import java.util.Stack;
  2. import android.app.Activity;

  3. public class ScreenManager {
  4. private static Stack<Activity> activityStack;
  5. private static ScreenManager instance;
  6. private ScreenManager(){
  7. }


  8. public static ScreenManager getScreenManager(){
  9. if(instance==null){
  10. instance=new ScreenManager();
  11. }
  12. return instance;
  13. }


  14. public void popActivity(){
  15. Activity activity=activityStack.lastElement();
  16. if(activity!=null){
  17. activity.finish();
  18. activity=null;
  19. }
  20. }


  21. public void popActivity(Activity activity){
  22. if(activity!=null){
  23. activity.finish();
  24. activityStack.remove(activity);
  25. activity=null;
  26. }
  27. }


  28. public Activity currentActivity(){
  29. Activity activity=activityStack.lastElement();
  30. return activity;
  31. }


  32. public void pushActivity(Activity activity){
  33. if(activityStack==null){
  34. activityStack=new Stack<Activity>();
  35. }
  36. activityStack.add(activity);
  37. }

  38. public void popAllActivityExceptOne(Class cls){
  39. while(true){
  40. Activity activity=currentActivity();
  41. if(activity==null){
  42. break;
  43. }
  44. if(activity.getClass().equals(cls) ){
  45. break;
  46. }
  47. popActivity(activity);
  48. }
  49. }
  50. }
複製代碼
                Stack<Activity>這個就是我們自定義的activity棧,這個寫好後,我們就開始一步一步的來實現我們要跳轉的界麵了。用了這個Stack<Activity>就給我們節省很多的資源和時間,有了這個我們頁就不用那麼麻煩了               
                 從上麵的代碼我們知道了在每個方法的下麵都會用到判斷,這個是非常主要的,因為當我們判斷完事了,才可以執行下麵的代碼,就像是我們要跳轉界麵一樣,我們這個跳轉的話,是必須你同意才能跳轉的,如果沒有判斷的話,當你到達這個界麵的時候,就不會停止在這個界麵,而是再跳到下一個界麵,這樣就會出現bug。所以大家一定要記住這個。

最後更新:2017-04-03 20:19:27

  上一篇:go JDK各版本的API下載
  下一篇:go Mysql存儲過程中使用cursor