Activity栈清空

 

一、clearTaskOnLaunch:

clearTaskOnLaunch仅对根Activity有效

When the value is "true", every timeusers start the task again, they are brought to its root activity regardless ofwhat they were last doing in the task and regardless of whether they used theBackorHome button to leave it. When the value is "false", the task maybe cleared of activities in some situations (see thealwaysRetainTaskState attribute), but not always.

在AndroidManifest中,设置这个参数,当这个参数是true的时候,每次启动应用都会进入root activity 。不管之前是按back键的还是home键的。

二、用FLAG_ACTIVITY_CLEAR_TOP 实现清空Activity栈:

intent intent = new Intent(currentActivity,startActivity);

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

startActivity(intent);

startActivity的启动模式为默认的。

应用首次启动的是startActivity,而且在启动后不finish掉,跳转到其他的activity。

这种方式可以实现当前栈中startActivity上面的所有activity被清空。

系统原理:

假设启动顺序是:startActivity-->A-->B-->C-->startActivity(此时设置FLAG_ACTIVITY_CLEAR_TOP),则系统清理的顺序是,先由C在栈中由上向下查找,直到查找到startActivity为止,然后开始在栈中由下向上清理,先finish掉A,然后B,然后C。此时会将startActivity销毁掉,然后重建。

存在以下几种情况:

1、 startActivity启动模式设置为singleTask:

设置成singleTask:由于startActivity只创建一次。再次进入startActivity会走进startActivity的onNewIntent方法,不走onCreate。栈中的顺序会发生改变。默认启动栈中自下向上顺序:startActivity-->A-->B-->startActivity-->C;  设置后将是: startActivity-->C,这个时候由C进行clearTop或者不进行,栈中都只剩下startActivity。一般应用中,startActivity不设置成singleTask启动模式。

2、 startActivity启动模式设置成singleInstance:

启动startActivity的时候会新创建一个Task,这个Task只有startActivity,由startActivity跳转到A的时候,会新创建另外一个Task用于存放之后A、B、C(他们都是默认启动模式的),最后clearTop的时候,只能清空存有startActivity的那个Task(log可以看到startActivity会清掉,然后重建一个startActivity),A、B、C、都不能清掉。

3、 startActivity启动模式设置成singleTop

startActivity-->A-->B-->C-->startActivity(此时设置FLAG_ACTIVITY_CLEAR_TOP),系统会将startActivity上面的activity清掉,不会将startActivity销毁,通过其onNewIntent方法进入,如果此时想连startActivity一起销毁(即退出应用),可以在onNewIntent中获取flag,然后进行finish处理。

if((Intent.FLAG_ACTIVITY_CLEAR_TOP & intent.getFlags()) != 0)

 { finish(); }

4、 startActivity是默认启动模式的,多次起启动startActivity。

栈中由下到上的顺序:startActivity-->A-->B-->startActivity-->C,当由 C进入startActivity 并且intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)的时候,系统会从C开始往下找,找到了离他最近的一个startActivity,进行clearTop。此时栈中还有startActivity、A、B,清空失败。

 

三、自己建立一个activity栈管理

所有的activity都继承自同一个母MainActivity,在onCreate的时候,将其添加到自己建立的管理栈中,最后在需要请空栈的时候,将栈清理掉即可。

ActivityManagerDemo.java

publicclass ActivityManagerDemo {

    privatestatic Stack activityStack;

    privatestatic ActivityManagerDemo instance;

    private ActivityManagerDemo(){

    }

    public static ActivityManagerDemo getActivityManager(){

        if(instance == null){

            instance = new ActivityManagerDemo();

        }
        return instance;
    }

    public void  popActivityStack(Activity activity){      

        if(null != activity){

            activity.finish();

            activityStack.remove(activity);

            activity= null;

        }
    }

    public void pushActivity2Stack(Activity activity){

        if(activityStack== null){

            activityStack= newStack();

        }

        activityStack.add(activity);

    }

    public ActivitygetCurrentActivity(){

        Activityactivity = null;

        if(!activityStack.isEmpty()){

            activity= activityStack.lastElement();

        }

        return activity;

    }

    public void popAllActivityFromStack(){

         while(true){
                Activity activity = getCurrentActivity();
                if(activity == null){
                    break;
                }
               
                popActivityStack(activity);
            }

    }

}

MainActivity里onCreate方法调用pushActivity2Stack,将所有打开的activity push到栈中。需要清空的时候调用popAllActivityFromStack便可以清空。


Intent.FLAG_ACTIVITY_CLEAR_TASK

Intent.FLAG_ACTIVITY_CLEAR_TASK实现清空当前task功能,必须要和Intent.FLAG_ACTIVITY_NEW_TASK一起用,但是受到安卓版本号的限制,在Api 11以上才可以起作用。

intent intent = new Intent(currentActivity,startActivity);

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

startActivity(intent);

常识补充:

standard  每次都会新建,每个Task都可以有,且每个Task都可以有多个实例(每个Task都可以有,且可以有多个)  

singleTop 当前实例如果在栈顶,就不新建实例,调用其OnNewIntent。 如不在栈顶,则新建实例(每个Task都可以有,且可以有多个,在栈顶时可复用)  

singleTask 新建一个Task,如果已经有其他的Task并且包含该实例,那就直接调用那个Task的实例。(只有一个Task中会有)  

singleInstance 新建一个Task,且在该Task中只有它的唯一一个实例。 (只有一个Task会有,且该Task中只有它)  

你可能感兴趣的:(技术提高)