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

作者:sapodilla 时间:2023-03-29 12:20:43 

前言

开始始学习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();
     }
   });

}
}

来源:https://blog.csdn.net/sapodilla/article/details/77868735

标签:android,点击,Activity
0
投稿

猜你喜欢

  • ADO.NET实体数据模型详细介绍

    2023-10-16 12:15:41
  • 详解关于Windows10 Java环境变量配置问题的解决办法

    2023-02-06 10:53:29
  • Android自定义顶部标题栏

    2023-02-21 19:03:47
  • IDEA查看Scala的源码的教程图解

    2023-12-13 22:50:45
  • 详解Java接口签名(Signature)实现方案

    2022-02-05 09:28:57
  • Spring security如何重写Filter实现json登录

    2023-09-15 13:33:31
  • Android实现简单的文件下载与上传

    2022-02-25 00:00:14
  • Android获取app应用程序大小的方法

    2023-09-18 15:02:18
  • SpringBoot集成cache缓存的实现

    2023-11-27 16:37:39
  • 总结C#网络编程中对于Cookie的设定要点

    2021-12-28 20:16:43
  • Java窗口精细全方位讲解

    2023-03-05 15:35:15
  • Idea 搭建Spring源码环境的超详细教程

    2023-09-30 16:13:17
  • C# List<T>的用法小结

    2021-12-03 10:40:28
  • Springboot全局异常捕获及try catch区别解析

    2022-03-02 17:44:07
  • J2ee 高并发情况下监听器实例详解

    2022-12-26 05:47:43
  • C#判断上传文件是否是图片以防止木马上传的方法

    2023-10-02 13:13:50
  • IDEA 使用mybatis插件Free Mybatis plugin的步骤(推荐)

    2022-12-05 02:01:03
  • Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法

    2023-11-19 00:24:05
  • Android ExpandableListView单选以及多选实现代码

    2023-01-14 20:45:51
  • Android GPS定位测试(附效果图和示例)

    2023-05-11 17:38:10
  • asp之家 软件编程 m.aspxhome.com