分享

Android通过Activity栈方式对Activity管理

 命運之輪 2012-09-14

  Activity是Android程序的表现层。程序的每一个显示屏幕就是一个Activity。正在运行的Activity处在栈的最顶端,它是运行状态的。

    当有新的Activity进入屏幕最上端时,原来的Activity就会被压入第二层。如果他的屏幕没有被完 全遮盖,那么他处于Paused状态,如果他被遮盖那么处于Stop状态。

    不管处于任何一层,都可能在系统觉得资源不足时被强行关闭,当然关闭时栈底的程序最先被关闭。

    譬如:当你在程序中调用 Activity.finish()方法时,结果和用户按下 BACK 键一样:他告诉 Activity Manager该Activity实例可以被“回收”。随后 Activity Manager 激活处于栈第二层的 Activity 并重 新入栈,把原 Activity 压入到栈的第二层,从 Running 状态转到 Paused 状态。


在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的类的定义如下:

  1. import java.util.Stack; 

    import android.app.Activity; 

    public class ScreenManager { 
    private static Stack 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){ 
    if(activity!=null){ 
    activity.finish(); 
    activityStack.remove(activity); 
    activity=null; 


    public Activity currentActivity(){ 
    Activity activity=activityStack.lastElement(); 
    return activity; 

    public void pushActivity(Activity activity){ 
    if(activityStack==null){ 
    activityStack=new Stack(); 

    activityStack.add(activity); 


    public void popAllActivityExceptOne(Class cls){ 
    while(true){ 
    Activity activity=currentActivity(); 
    if(activity==null){ 
    break; 

    if(activity.getClass().equals(cls) ){ 
    break; 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多