最近在做Launcher与业务模块之间的跳转,为了保证模块跳转以及返回正常,点击Home键后需要清空业务模块的Activity Task栈。
实现方式:
自定义一个ActivityManager管理类,用于管理栈中的Activity,这个需要跳转的过程中配合Flag使用,可以参考http://www.cnblogs.com/zl1991/p/6307580.html实现。
单纯通过跳转的Flag去控制清空栈:
Intent intent = newIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.setClass(MainActivity.this,Activity.class);
startActivity(intent);实测效果不好,难道是姿势不对?
最终我是通过将打开的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