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

所属分类: 软件编程 / Android 阅读数: 63
收藏 0 赞 0 分享

前言

开始始学习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界面的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Android 动画之AlphaAnimation应用详解

本节讲解AlphaAnimation 动画,窗口的动画效果,淡入淡出什么的,有些游戏的欢迎动画,logo的淡入淡出效果就使用AlphaAnimation,具体的祥看本文,需要的朋友可以参考下
收藏 0 赞 0 分享

Android 动画之TranslateAnimation应用详解

本节讲解TranslateAnimation动画,TranslateAnimation比较常用,比如QQ,网易新闻菜单条的动画,就可以用TranslateAnimation实现,本文将详细介绍通过TranslateAnimation 来定义动画,需要的朋友可以参考下
收藏 0 赞 0 分享

Android 动画之ScaleAnimation应用详解

本节讲解ScaleAnimation 动画在应用中的实现,有需要的朋友可以参考下
收藏 0 赞 0 分享

Android 动画之RotateAnimation应用详解

本节讲解旋转动画效果RotateAnimation方法的应用,有需要的朋友可以参考下
收藏 0 赞 0 分享

Android开发之文件操作模式深入理解

本文将介绍Android开发之文件操作模式,需要了解的朋友可以参考下
收藏 0 赞 0 分享

Android应用程序窗口(Activity)窗口对象(Window)创建指南

本文将详细介绍Android应用程序窗口(Activity)的窗口对象(Window)的创建过程,需要了解的朋友可以参考下
收藏 0 赞 0 分享

android activity设置无标题实现全屏

本文将详细介绍Android如何设置Activity全屏和无标题的实现方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android启动模拟器报错解决方法

本文将详细介绍Android模拟器报"Failed To Allocate memory 8"错误的解决办法,需要了解的朋友可以参考下
收藏 0 赞 0 分享

Android如何实现非本地图片的点击态

Android如何实现非本地图片的点击态,本文提供了详细的实现代码,需要了解的朋友可以参考下
收藏 0 赞 0 分享

android viewpaper实例探讨

本文将提供一个android viewpaper实例实现过程,需要了解更多的朋友可以参考下
收藏 0 赞 0 分享
查看更多