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

关于android连续点击出现多个Activity界面的解决方法

程序员文章站 2022-06-10 22:57:09
前言 开始始学习android,对android的启动模式没有什么了解,就使用了时间判断是否重复点击了两次按钮,启动另外的activity界面,这样的控制方法,有时候会失效,比如,两秒钟还未启动另外的...

前言

开始始学习android,对android的启动模式没有什么了解,就使用了时间判断是否重复点击了两次按钮,启动另外的activity界面,这样的控制方法,有时候会失效,比如,两秒钟还未启动另外的activity,那么又可以重复点击。所以,就调整为android的启动模式来控制重复出现多个acitvity。

一、通过时间控制点击次数:

这种方式对应控制网络请求不错。

public class nodoubleclickutil {
  private static long lastclicktime;
  private final static int space_time =2000;

  public static void initlastclicktime() {
    lastclicktime = 0;
  }

  public synchronized static boolean isdoubleclick() {
    long currenttime = system.currenttimemillis();
    boolean isclickdouble;
    if (currenttime - lastclicktime >
        space_time) {
      isclickdouble = false;
    } else {
      isclickdouble = true;
    }
    lastclicktime = currenttime;
    return isclickdouble;
  }
}

二、通过launchmode启动模式控制出现多个activity的方式:

这种方式真正意义上杜绝了同时出现相同的多个activity。

<activity android:name=".internethospital.internethospitalinquirycallui"
android:launchmode="singleinstance"/>

或者在代码中设置:

intent intent = new intent();
intent.setclass(getapplicationcontext(), targetactivity.class);
intent.setflags(intent.flag_activity_single_top);
startactivity(intent);

三、android的四种启动模式:

1、standard模式:每次调用startactivity()启动时都会创建一个新的activity放在栈顶(默认都是这个模式)

2、singletop模式:启动activity时,指定activity不在栈顶就创建,如在栈顶,则不再创建(不会出现两个相同的activity相邻)

3、singletask模式:如果启动的activity不存在就创建activity,如果存在直接跳转到指定的activity所在位置(在其上面的activity会被移出栈,也就是一个栈中不能有重复的activity)

4、singleinstance模式:如果启动的activity不存在就创建一个activity同时创建一个栈,如果存在就将指定的activity存在的栈移动到栈顶(表示这个activity只能存在于一个独立的任务栈中,同应用的其它activity与其无关)

补充知识:android中退出多个activity的两个经典方法

一种把每个activity用集合记住,然后逐一干掉;另一种思路是使用广播。

方法一、用list保存activity实例,然后逐一干掉

创建一个外部类继承application用来存放activity

public class myactvity extends application {
  //创建一个集合,用来存放activity的对象
  arraylist<activity>list=new arraylist<>();
  //声明一个本类的对象
  private static myactvity instance;
  public myactvity() {
  }
  //创建一个方法,用来初始化myactivity的对象,并且初始化的对像的返回
  public synchronized static myactvity getinstance(){
    if (instance==null){
      instance=new myactvity();
    }
    return instance;
  }
  //调用此方法用来向集合当中添加activity对象
  public void addactivity(activity activity){
    list.add(activity);
  }
  //判断activity是否已经在集合当中
  public boolean isexitlist(activity activity){
    if (list.contains(activity)){
      return true;
    }
    return false;
  }
  //当调用此方法的时候,关闭所有的activity
  public void exit(){
    for (activity activity:list){
      activity.finish();
    }
    //退出当前的myactivity
    system.exit(0);
  }

  @override
  public void onlowmemory() {
    super.onlowmemory();
    //当系统的存储空间不够的时候,调用系统的垃圾回收期,清理里面的垃圾
    system.gc();
  }
}

activity1代码:

public class mainactivity extends appcompatactivity {

  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.activity_main);
    //调用存放activity类
    myactvity instance = myactvity.getinstance();
    //判断存放activity类是否存放该activity,不存在加入类
    if (!instance.isexitlist(this)){
      instance.addactivity(this);
    }
    intent intent = new intent(this, main2activity.class);
    startactivity(intent);
  }
}

activity2代码:

public class main2activity extends activity {

  private myactvity instance;

  /**
   * called when the activity is first created.
   */

  @override+
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.sdfa);
    button bt= (button) findviewbyid(r.id.bt);
    instance = myactvity.getinstance();
    if (!instance.isexitlist(this)){
      instance.addactivity(this);
    }
    bt.setonclicklistener(new view.onclicklistener() {
      @override
      public void onclick(view v) {
      //调用exit()方法销毁里面所有activity
        instance.exit();
      }
    });

  }
}

方法二、使用广播在activity里注册广播,销毁时启动广播

mainactivity里注册广播:

public class mainactivity extends appcompatactivity {

  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.activity_main);
    intent intent = new intent(this, main2activity.class);
    startactivity(intent);
    //注册广播
    intentfilter intentfilter = new intentfilter();
    intentfilter.addaction(define.pahname);
    registerreceiver(new myreceiver(),intentfilter);
  }
  class myreceiver extends broadcastreceiver{

    @override
    public void onreceive(context context, intent intent) {
      unregisterreceiver(this);
      ((activity)context).finish();
    }
  }
}

activity2:启动广播

public class main2activity extends activity {
  @override
  public void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.sdfa);
    button bt= (button) findviewbyid(r.id.bt);
    bt.setonclicklistener(new view.onclicklistener() {
      @override
      public void onclick(view v) {
        intent intent = new intent(define.pahname);
        sendbroadcast(intent);
        finish();
      }
    });

  }
}

以上这篇关于android连续点击出现多个activity界面的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。