關(guān)于android連續(xù)點(diǎn)擊出現(xiàn)多個(gè)Activity界面的解決方法
前言
開始始學(xué)習(xí)android,對(duì)android的啟動(dòng)模式?jīng)]有什么了解,就使用了時(shí)間判斷是否重復(fù)點(diǎn)擊了兩次按鈕,啟動(dòng)另外的activity界面,這樣的控制方法,有時(shí)候會(huì)失效,比如,兩秒鐘還未啟動(dòng)另外的activity,那么又可以重復(fù)點(diǎn)擊。所以,就調(diào)整為android的啟動(dòng)模式來(lái)控制重復(fù)出現(xiàn)多個(gè)acitvity。
一、通過(guò)時(shí)間控制點(diǎn)擊次數(shù):
這種方式對(duì)應(yīng)控制網(wǎng)絡(luò)請(qǐng)求不錯(cuò)。
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; }}
二、通過(guò)launchMode啟動(dòng)模式控制出現(xiàn)多個(gè)activity的方式:
這種方式真正意義上杜絕了同時(shí)出現(xiàn)相同的多個(gè)activity。
<activity android:name='.InternetHospital.InternetHospitalInquiryCallUI'android:launchMode='singleInstance'/>
或者在代碼中設(shè)置:
Intent intent = new Intent();intent.setClass(getApplicationContext(), TargetActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);startActivity(intent);
三、android的四種啟動(dòng)模式:
1、standard模式:每次調(diào)用startActivity()啟動(dòng)時(shí)都會(huì)創(chuàng)建一個(gè)新的Activity放在棧頂(默認(rèn)都是這個(gè)模式)
2、singleTop模式:?jiǎn)?dòng)Activity時(shí),指定Activity不在棧頂就創(chuàng)建,如在棧頂,則不再創(chuàng)建(不會(huì)出現(xiàn)兩個(gè)相同的Activity相鄰)
3、singleTask模式:如果啟動(dòng)的Activity不存在就創(chuàng)建Activity,如果存在直接跳轉(zhuǎn)到指定的Activity所在位置(在其上面的Activity會(huì)被移出棧,也就是一個(gè)棧中不能有重復(fù)的Activity)
4、singleInstance模式:如果啟動(dòng)的Activity不存在就創(chuàng)建一個(gè)Activity同時(shí)創(chuàng)建一個(gè)棧,如果存在就將指定的Activity存在的棧移動(dòng)到棧頂(表示這個(gè)Activity只能存在于一個(gè)獨(dú)立的任務(wù)棧中,同應(yīng)用的其它Activity與其無(wú)關(guān))
補(bǔ)充知識(shí):Android中退出多個(gè)Activity的兩個(gè)經(jīng)典方法
一種把每個(gè)activity用集合記住,然后逐一干掉;另一種思路是使用廣播。
方法一、用list保存activity實(shí)例,然后逐一干掉
創(chuàng)建一個(gè)外部類繼承Application用來(lái)存放activity
public class MyActvity extends Application { //創(chuàng)建一個(gè)集合,用來(lái)存放activity的對(duì)象 ArrayList<Activity>list=new ArrayList<>(); //聲明一個(gè)本類的對(duì)象 private static MyActvity instance; public MyActvity() { } //創(chuàng)建一個(gè)方法,用來(lái)初始化MyActivity的對(duì)象,并且初始化的對(duì)像的返回 public synchronized static MyActvity getInstance(){ if (instance==null){ instance=new MyActvity(); } return instance; } //調(diào)用此方法用來(lái)向集合當(dāng)中添加activity對(duì)象 public void addActivity(Activity activity){ list.add(activity); } //判斷activity是否已經(jīng)在集合當(dāng)中 public boolean isexitlist(Activity activity){ if (list.contains(activity)){ return true; } return false; } //當(dāng)調(diào)用此方法的時(shí)候,關(guān)閉所有的activity public void exit(){ for (Activity activity:list){ activity.finish(); } //退出當(dāng)前的MyActivity System.exit(0); } @Override public void onLowMemory() { super.onLowMemory(); //當(dāng)系統(tǒng)的存儲(chǔ)空間不夠的時(shí)候,調(diào)用系統(tǒng)的垃圾回收期,清理里面的垃圾 System.gc(); }}
Activity1代碼:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //調(diào)用存放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) { //調(diào)用exit()方法銷毀里面所有activityinstance.exit(); } }); }}
方法二、使用廣播在activity里注冊(cè)廣播,銷毀時(shí)啟動(dòng)廣播
MainActivity里注冊(cè)廣播:
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); //注冊(cè)廣播 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:?jiǎn)?dòng)廣播
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(); } }); }}
以上這篇關(guān)于android連續(xù)點(diǎn)擊出現(xiàn)多個(gè)Activity界面的解決方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. el-input無(wú)法輸入的問(wèn)題和表單驗(yàn)證失敗問(wèn)題解決2. 不要在HTML中濫用div3. react腳手架配置代理的實(shí)現(xiàn)4. JavaScript中顏色模型的基礎(chǔ)知識(shí)與應(yīng)用詳解5. XML 增、刪、改和查示例6. JavaScript快速實(shí)現(xiàn)一個(gè)顏色選擇器7. CSS3實(shí)例分享之多重背景的實(shí)現(xiàn)(Multiple backgrounds)8. XML入門的常見問(wèn)題(三)9. 前端html+css實(shí)現(xiàn)動(dòng)態(tài)生日快樂(lè)代碼10. React實(shí)現(xiàn)一個(gè)倒計(jì)時(shí)hook組件實(shí)戰(zhàn)示例
