欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 关闭多个Activity的实现方法

程序员文章站 2023-12-18 22:41:46
android 关闭多个activity的实现方法 总的来说有四种方法: 1、使用application来进行关闭 public class app exte...

android 关闭多个activity的实现方法

总的来说有四种方法:

1、使用application来进行关闭

public class app extends application { 

  private static list<activity> lists = new arraylist<>(); 

  public static void addactivity(activity activity) { 
    lists.add(activity); 
  } 

  public static void clearactivity() { 
    if (lists != null) { 
      for (activity activity : lists) { 
        activity.finish(); 
      } 

      lists.clear(); 
    } 
  } 
} 

//然后写一个基类activity,在构造构造方法调用app.addactivity(this);就可以实现。

2、使用广播的方式来进行关闭

在基类构造方法中实现注册广播,ondestroy方法取消注册

public class baseactivity extends appcompatactivity { 

  @override 
  protected void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 

    intentfilter intentfilter = new intentfilter(); 
    intentfilter.addaction(getstring(r.string.promotion_action)); 
    registerreceiver(receiver, intentfilter); 
  } 

  broadcastreceiver receiver = new broadcastreceiver() { 
    @override 
    public void onreceive(context context, intent intent) { 
      finish(); 
    } 
  }; 

  @override 
  protected void ondestroy() { 
    super.ondestroy(); 
    unregisterreceiver(receiver); 
  } 
} 

接下来只需要你在想要关闭所有activity的界面调用

//销毁所有的activity 
//关闭本窗口
getactivity().finish();

//关闭父窗口
if(getactivity().getparent()!= null){
  getactivity().getparent().finish();
}

//关闭列表页面
intent intent = new intent();
intent.setaction(getstring(r.string.promotion_action));
getactivity().sendbroadcast(intent);

3、使用onactivityresult递归回调的方式关闭

1)在基类activity重写onactivityresult方法通过识别resultcode来调用finish方法

2)接下来只需要在你想要关闭activity调用setresult(result_close)就可以了

public class baseactivity extends appcompatactivity { 
  protected final static int result_close = 0; 
  @override 
  protected void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 
  } 

  @override 
  protected void onactivityresult(int requestcode, int resultcode, intent data) { 
    super.onactivityresult(requestcode, resultcode, data); 
    if(resultcode == result_close){ 
      setresult(result_close); 
      finish(); 
    } 
  } 
} 

4.使用setfalgs的方式来关闭

首先先来介绍一个launchmode四种模式:

launchmode

1)standard和singletop是相同的,每次都会创建一个新的activity实例,区别是singletop当压入栈的activity与任务栈的栈顶activit相同则不会创建实例(会调用onnewintent方法)

2)singleinstance和singletask是相同的,都会保证任务中没有相同的任务,(当执行的activity与任务中某个activity相同则会调用onnewintent方法),不同点是(singleinstance每次都会创建一个任务栈并将activity压入栈中),(singletask是在一个任务栈中,如果压入栈的activity与栈内activity某个相同则直接将那个activity移动到栈顶不会创建新的实例)

当然这里并没有用到这四种模式而是运用的是intent.flag_activity_clear_top,这种标示基本和singletop类似不同的是如果压入栈的activity在栈内某个activity相同则将它上面的所有activity进行出栈操作。

在每次跳转都加上

intent.setflags(intent.flag_activity_clear_top); 

所以在最后一个activity后退应用:

@override 
public boolean onkeydown(int keycode, keyevent event) { 
  if (keycode == keyevent.keycode_back) { 
    //销毁所有的activity 
    intent intent = new intent(this,firstactivity.class); 
    intent.setflags(intent.flag_activity_clear_top); 
    startactivity(intent); 
  } 
  return super.onkeydown(keycode, event); 
} 

这样略先复杂,现在来说一下使用flag的另一种方法:

在退出的activity的前一个activity跳转加上

intent.setflags(intent.flag_activity_new_task | intent.flag_activity_clear_task | intent.flag_activity_task_on_home); 

就可以了,现在来说一下这几个什么意思

/* 
  flag_activity_clear_task 这个标示将在这个活动开始之前清除该栈中所有的任务,将里面的activity都finish掉 
  flag_activity_task_on_home 这个flag将造成新任务在home的上面,就是在启动的activity点击back之后就会回到home界面 
 */ 

 

如有疑问请留言或到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

上一篇:

下一篇: