我们经常遇到activity跳转到另外一个activity需要跳回去或者直接销毁的情况。在这种情况下我们怎样设计较好的机制处理这种问题呢?下面我总结出了两种解决方案。
1.使用activitymanager
跳转过的路径上的activity保存到activitymanager里面,需要删除的时候通过activitymanager删除。
但是这种方法有问题,activity被引用了会造成内存泄漏。虽然这个模块功能用完了可以全部销毁里面的activity,但是在运行中还是会造成内存泄漏。
public class ScreenManager {
private static Stack<Activity> activityStack;
private static ScreenManager instance;
private ScreenManager(){}
public static ScreenManager getScreenManager(){
if(instance==null){
instance=new ScreenManager();
}
return instance;
}
public void popActivity(){
if(activityStack.empty()) return;
Activity activity = activityStack.lastElement();
if(activity!=null){
activity.finish();
activity=null;
}
}
public void popActivity(Activity activity){
if(activity!=null){
activity.finish();
if(!activityStack.empty()){
activityStack.remove(activity);
activity=null;
}
}
}
public Activity currentActivity(){
if(!activityStack.empty()){
Activity activity=activityStack.lastElement();
return activity;
}else{
return null;
}
}
public void pushActivity(Activity activity){
if(activityStack==null){
activityStack=new Stack<Activity>();
}
activityStack.add(activity);
}
public void popAllActivityExceptOne(Class cls){
while(true){
Activity activity=currentActivity();
if(activity==null){
break;
}
if(activity.getClass().equals(cls) ){
break;
}
popActivity(activity);
}
}
public void popAllActivity(){
while(true){
Activity activity=currentActivity();
if(activity==null){
break;
}
activity.finish();
popActivity(activity);
}
}
public boolean isEmpty(){
if(activityStack==null){
activityStack=new Stack<Activity>();
}
return activityStack.empty();
}
}
2.第二种方法通过activity自带的
CustomerActivity.this.startActivityForResult(intent,REQUESTCODE);
以及
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUESTCODE) {
if (data != null && data.getBooleanExtra(REQUESTFINISH, false)) {
finish();
}
}
}
这个系统自带的方法进行处理。
具体就是在启动路径上所有activity时传递参数过去,在节点销毁时调用
Intent intent = new Intent();
intent.putExtra(IS_CONFIRM, isConfirm);
CustomerActivity.this.setResult(RESULT_CODE, intent);
通过调用这个方法,系统将销毁信息带回传导到节点,销毁路径上的节点activity。
当然可能还会有更好的解决方法,欢迎大家下面留言交流