關於android連續點擊出現多個Activity介面的解決方法
前言
開始始學習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介面的解決方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。