关于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 重写ViewGroup 分析onMeasure()和onLayout()方法在继承ViewGroup类时,需要重写两个方法,
- 最近要做一个网站,要求实现验证码程序,经过不断调试,终于成功实现功能。一、验证码生成类生成验证码的话需要用到java的Graphics类库,
- PipedWriter和PipedReader源码分析1. PipedWriter 源码(基于jdk1.7.40) package
- 题目要求思路:模拟解题的核心思想在于逆向思维,不考虑每个子数组中的唯一字符个数,转而考虑每个字符可以作为多少个子数组的唯一字符;所以在计算答
- 背景:Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了
- 承接上文 传送门一.完善登录功能按照常理,只有登陆过后才能进入首页,若没有登陆则应当直接跳转到登陆页面,这样的场景不就完美契合过滤器的功效吗
- 使用Convert接口实现类型转换器在Spring3中引入了一个Converter接口,它支持从一个Object转为另一个Object。除了
- 一条SQL使用两个foreach的问题未修改前的 SQL 语句<select id="findQuestionType_3_
- 定时任务技术趋势简介:定时任务是每个业务常见的需求,比如每分钟扫描超时支付的订单,每小时清理一次数据库历史数据,每天统计前一天的数据并生成报
- 前言痛点:在java开发的过程中,我们经常要面对各种各样的环境,比如开发环境,测试环境,正式环境,而这些环境对项目的需求也不相同。在此之前,
- 前言在Android开发过程中,Bitmap往往会给开发者带来一些困扰,因为对Bitmap操作不慎,就容易造成OOM(Java.lang.O
- 本文实例讲述了Java实现的双向匹配分词算法。分享给大家供大家参考,具体如下:目前比较流行的几大分词算法有:基于字符串匹配的分词方法、基于理
- 本文实例为大家分享了java金额数字转中文工具类的具体代码,供大家参考,具体内容如下java金额数字转中文工具类ConvertNum.jav
- ps:我用的版本是7.0.5场景:左侧第一列宽度不够,导致数据换行。Table table = new Table(new float[2]
- privatestring[]GetMoc() { string[]str=newstring[3]; ManagementClassmcC
- 本文实例讲述了android打开本地图像的方法。分享给大家供大家参考。具体如下:方法一,调用手机安装的图像浏览工具浏览:Intent int
- 用AndroidStudio编写高级计算器带三角函数对数运算功能界面效果图:layout布局 activity_jisuanqi.xml代码
- Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。一、当两个并发线程访问同一个
- 目录1.引用Nuget包 ServiceStack.Redis2. string 类型的使用作
- 本文实例为大家分享了java模拟实现电话本系统的具体代码,供大家参考,具体内容如下java 模拟 电话本系统 (基础版)需求:注意的是,联系