前言
开始始学习android,对android的启动模式没有什么了解,就使用了时间判断是否重复点击了两次按钮,启动另外的activity界面,这样的控制方法,有时候会失效,比如,两秒钟还未启动另外的activity,那么又可以重复点击。所以,就调整为android的启动模式来控制重复出现多个acitvity。
一、通过时间控制点击次数:
这种方式对应控制网络请求不错。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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"/>
或者在代码中设置:
1
2
3
4
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
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代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
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里注册广播:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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:启动广播
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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界面的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/sapodilla/article/details/77868735