清空Activity Task栈

来源:互联网 发布:怎么选帽子 知乎 编辑:程序博客网 时间:2024/06/06 07:16

最近在做Launcher与业务模块之间的跳转,为了保证模块跳转以及返回正常,点击Home键后需要清空业务模块的Activity Task栈。

实现方式:

  1. 自定义一个ActivityManager管理类,用于管理栈中的Activity,这个需要跳转的过程中配合Flag使用,可以参考http://www.cnblogs.com/zl1991/p/6307580.html实现。

  2. 单纯通过跳转的Flag去控制清空栈:
    Intent intent = newIntent();
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK);
    intent.setClass(MainActivity.this,Activity.class);
    startActivity(intent);

    实测效果不好,难道是姿势不对?

  3. 最终我是通过将打开的activity记录下来,在合适的时机将其从栈内移除。
    (1)在Application初始化存储所有打开activity的集合。

public class App extends Application {    public static App app;    /**     * 用于存储所有打开activity的集合     */    private final LinkedList<Activity> mActivitys = new LinkedList<>();    @Override    public void onCreate() {        super.onCreate();        app = this;    }    /**     * Activity开启时添加Activity到集合     *     * @param activity     */    public void addActivity(Activity activity) {        mActivitys.addFirst(activity);    }    /**     * Activity退出时清除集合中的Activity.     *     * @param activity 被移除的activity     */    public void removeActivity(Activity activity) {        mActivitys.remove(activity);    }    /**     * 清除 除了自己外其他activity     *  @param oneself 不被移除的activity     */    public void removeOtherActivity(Activity oneself) {        try {            for (Activity activity : mActivitys) {                if (activity!=null && !activity.getLocalClassName().equals(oneself.getLocalClassName())){                    activity.finish();                }            }        }catch (Exception e){            e.printStackTrace();        }    }    /**     * 退出应用时调用     */    public void exit() {        for (Activity activity : mActivitys) {            if (activity!=null){                activity.finish();            }        }    }}

(2)在BaseActivity中调用,如果没有BaseActivity那么只能在每个activity中添加了:

public class BaseActivity extends AppCompatActivity{    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        App.app.addActivity(this);        super.onCreate(savedInstanceState);    }    @Override    protected void onDestroy() {        App.app.removeActivity(this);        super.onDestroy();    }}

(3)在合适的时机调用

    App.app.removeOtherActivity(this);//从桌面进入,移除栈内除了自己之外所有的activity

或者调用

 App.app.exit();//清空所有Activity