銷燬全部的Activity,退出當前應用
我用的是廣播方式,缺點是退出的是全部的activity,不能銷燬指定的activity(但是好像用的不多)。此外,我在A介面設定了啟動模式為singleTask,當有人登陸賬號時就會從你設定的賬號異常登陸的操作介面A 跳到 登陸頁面。
裡邊第三種的方法我試了總是崩潰,不知道為什麼。
Android:銷燬所有的Activity退出應用程式幾種方式
author:DRC工作室
我們都知道,Activity是存放在棧中。在預設的情況下(standard)Activity在棧中是以先進後出、後進先出的方式進行存放。最開始出現的Activity會存在棧底,最新啟動的Activity總是會存在棧頂。當我們開啟的Activity越來越多,當前想在某個介面退出當前應用程式的時候,或者雙擊返回鍵退出當前應用程式。這個時候只能一個一個的把當前所有啟動的Activity銷燬,直到清空棧中的所有Activity,應用程式才能退出。下面給大家介紹四種常用的退出應用程式的方法,希望能夠更好的幫助大家開發!
銷燬所有Activity,退出應用程式常見的方式有下面四種:
(1) System.exit(0) 使用系統的方法,強制退出
(2) 丟擲異常,強制退出
(3) 使用Application退出
(4) 使用廣播退出
第一種方式 System.exit(0):表示的是終止程式,終止當前正在執行的 Java 虛擬機器,在java中我們也使用這種方式來關閉整個應用,在前期很多開發人員都是使用這種方式,我自己在開發專案過程中也用過這種方式來退出,但是有時候會在部分機型中,當退出應用後彈出應用程式崩潰的對話方塊,有時退出後還會再次啟動,少部分的使用者體驗不太好。但現在也依舊還會有少部分的開發人員會使用這種方式,因為使用方式很簡單,只需要在需要退出的地方加上這句程式碼就行。
第二種方式 丟擲異常,強制退出 :這種方式現在基本上已經看不到了,使用者體驗比第一種方式更差,就是讓丟擲異常、是系統崩潰、從而達到退出應用的效果。
<接下來我們主要講解後面兩種,這兩種在開發過程中經常使用>
第三種方式 使用Application退出 :目前比較常用方法之一,我們都知道application是Android的系統元件,當應用程式啟動時,會自動幫我們建立一個Application,而且一個應用程式只能存在一個Application,它的生命週期也是最長的,如果需要使用自己建立的Application時,這個時候我們只需要在Androidmanifest.xml中的<Application> 標籤中新增name屬性:把建立的Application完整的包名+類名放進了就行了。
那麼我們如何使用Application來退出當前的應用程式呢?
我們來看下我寫的一個使用Application來退出應用程式的Demo:
<建立一個繼承Application的類>
public class myApplication extends Application {
private List<Activity> oList;//用於存放所有啟動的Activity的集合
public void onCreate() {
super.onCreate();
oList = new ArrayList<Activity>();
}
/**
* 新增Activity
*/
public void addActivity_(Activity activity) {
// 判斷當前集合中不存在該Activity
if (!oList.contains(activity)) {
oList.add(activity);//把當前Activity新增到集合中
}
}
/**
* 銷燬單個Activity
*/
public void removeActivity_(Activity activity) {
//判斷當前集合中存在該Activity
if (oList.contains(activity)) {
oList.remove(activity);//從集合中移除
activity.finish();//銷燬當前Activity
}
}
/**
* 銷燬所有的Activity
*/
public void removeALLActivity_() {
//通過迴圈,把集合中的所有Activity銷燬
for (Activity activity : oList) {
activity.finish();
}
}
}
<建立BaseActivity 繼承 Activity> 用於管理所有的Activity,所有的Activity都繼承這個類
public class BaseActivity extends Activity {
private myApplication application;
private BaseActivity oContext;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (application == null) {
// 得到Application物件
application = (myApplication) getApplication();
}
oContext = this;// 把當前的上下文物件賦值給BaseActivity
addActivity();// 呼叫新增方法
}
// 新增Activity方法
public void addActivity() {
application.addActivity_(oContext);// 呼叫myApplication的新增Activity方法
}
//銷燬當個Activity方法
public void removeActivity() {
application.removeActivity_(oContext);// 呼叫myApplication的銷燬單個Activity方法
}
//銷燬所有Activity方法
public void removeALLActivity() {
application.removeALLActivity_();// 呼叫myApplication的銷燬所有Activity方法
}
/* 把Toast定義成一個方法 可以重複使用,使用時只需要傳入需要提示的內容即可*/
public void show_Toast(String text) {
Toast.makeText(oContext, text, Toast.LENGTH_SHORT).show();
}
}
<MainActivity 繼承 BaseActivity 主介面---雙擊返回鍵,退出當前應用程式>
public class MainActivity extends BaseActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//繫結按鈕
public void button(View v) {
startActivity(new Intent(MainActivity.this, oneActivity.class));//跳轉到oneActivity
}
//重寫onKeyDown方法
public boolean onKeyDown(int keyCode, KeyEvent event) {
//判斷當點選的是返回鍵
if (keyCode == event.KEYCODE_BACK) {
exit();//退出方法
}
return true;
}
private long time = 0;
//退出方法
private void exit() {
//如果在兩秒大於2秒
if (System.currentTimeMillis() - time > 2000) {
//獲得當前的時間
time = System.currentTimeMillis();
showToast("再點選一次退出應用程式");
} else {
//點選在兩秒以內
removeALLActivity();//執行移除所以Activity方法
}
}
}
<oneActivity 繼承 BaseActivity>
public class oneActivity extends BaseActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.onelayout);
}
// 繫結按鈕
public void button(View v) {
Intent intent = new Intent(this, MainActivity.class);//跳轉到主介面
startActivity(intent);
}
}
< androidmanifest.xml 清單檔案>
<application
android:name="com.jxsw.chong.application_closeactivity.myApplication" //註冊myapplication
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.jxsw.chong.application_closeactivity.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.jxsw.chong.application_closeactivity.BaseActivity" />
<activity android:name="com.jxsw.chong.application_closeactivity.oneActivity" />
</application>
我們讓每個Activity都繼承於我們自己定義的BaseActivity,每次新開啟個Activity,就會在BaseActivity的oncreate()方法中就會執行addActivity()方法,方法裡面執行的是myApplication類中新增Activity的方法,把當前的Activity放進集合中,當連續點選兩次back返回鍵,執行銷燬所有Activity的方法。從而達到完全退出應用程式的效果。
ps:一定不要忘記在androidmanifest.xml中註冊myApplication
<-----以上程式碼都可以直接複製貼上可用
第四種方式 使用廣播退出 :使用廣播來實現退出應用程式,其實實現的思路相對於第三種更簡單,我們編寫一個BaseActivity,讓其他的Activity都繼承於它,當我需要退出時,我們就銷燬BaseActivity,那麼其他繼承與它的Activity都會銷燬。
我們來看下我寫的一個使用廣播來退出應用程式的Demo:
<BaseActivity>
public class BaseActivity extends Activity {
private MyBaseActiviy_Broad oBaseActiviy_Broad;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//動態註冊廣播
oBaseActiviy_Broad = new MyBaseActiviy_Broad();
IntentFilter intentFilter = new IntentFilter("drc.xxx.yyy.baseActivity");
registerReceiver(oBaseActiviy_Broad, intentFilter);
}
//在銷燬的方法裡面登出廣播
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(oBaseActiviy_Broad);//登出廣播
}
//定義一個廣播
public class MyBaseActiviy_Broad extends BroadcastReceiver {
public void onReceive(Context arg0, Intent intent) {
//接收發送過來的廣播內容
int closeAll = intent.getIntExtra("closeAll", 0);
if (closeAll == 1) {
finish();//銷燬BaseActivity
}
}
}
/**
* 顯示Toast資訊
*/
public void showToast(String text) {
Toast.makeText(this, text, 2000).show();
}
}
<MainActivity>
public class MainActivity extends BaseActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//繫結按鈕
public void button(View v) {
Intent intent = new Intent(this, oneActivity.class);
startActivity(intent);
}
//重寫onkeydown方法
public boolean onKeyDown(int keyCode, KeyEvent event) {
//點選的為返回鍵
if (keyCode == event.KEYCODE_BACK) {
exit();// 退出方法
}
return true;
}
private long time = 0;
//退出方法
private void exit() {
if (System.currentTimeMillis() - time > 2000) {
time = System.currentTimeMillis();
showToast("再點選一次退出應用程式");
} else {
Intent intent = new Intent("drc.xxx.yyy.baseActivity");
intent.putExtra("closeAll", 1);
sendBroadcast(intent);//傳送廣播
}
}
}
<oneActivity>
public class oneActivity extends BaseActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.onelayout);
}
// 繫結按鈕
public void button(View v) {
Intent intent = new Intent(this, MainActivity.class);//跳轉到MainActivity
startActivity(intent);
}
}
看到的另一篇博文,還沒試過,方法2應該和上邊的3一樣
殺死全部的Activity,退出當前程式
首先說明finish()殺死的只是當前的Activity,並不是全部的Activity
方法一:Dalvik VM的本地方法
1、android.os.Process.killProcess(android.os.Process.myPid()) 獲取PID,目前獲取自己的也只有該API,否則從/proc中自己的列舉其他程序吧,不過要說明的是,結束其他程序不一定有許可權,不然就亂套了。
2、System.exit(0) 常規java、c#的標準退出法,返回值為0代表正常退出
方法二:
(1)建立一個ActivityCollector.java,此類用作收集和銷燬activity的公共類
public class ActivityCollector { public static List<Activity> activities = new ArrayList<Activity>(); public static void addActivity(Activity activity) { activities.add(activity); } public static void removeActivity(Activity activity) { activities.remove(activity); } public static void finishAll() { for (Activity activity : activities) { if (!activity.isFinishing()) { activity.finish(); } } } }
(2).建立一個BaseActivity.java基類,專案中的所有activity都繼承此類,呼叫上面類的方法就可以。
public class BaseActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); ActivityCollector.addActivity(this); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); ActivityCollector.removeActivity(this); }
(3)讓A, B, C這三個activity分別去繼承BaseActivity.java
(4)只需要呼叫ActivityCollector.java中的finishAll()方法,就可以結束全部Activity了。
方法三、根據Activity的宣告週期
Android的視窗類提供了歷史棧,我們可以通過stack的原理來巧妙的實現
這裡我們在A視窗開啟B視窗時在Intent中直接加入標誌Intent.FLAG_ACTIVITY_CLEAR_TOP
這樣開啟B時將會清除該程序空間的所有Activity。
//在A視窗中使用下面的程式碼呼叫B視窗 Intent intent = new Intent(); intent.setClass(MainActivity.this, otherActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //注意本行的FLAG設定 startActivity(intent); //在B視窗中呼叫finish()就全部結束掉了