通過System.exit(0)、finish()以及傳回鍵,隻能結束目前的Activity,當我們打開多個Activity并需要直接退出整個Android應用時,需要多次單擊back傳回鍵,方能退出。給使用者體驗不是很好。下面我們來介紹幾種直接退出整個Android應用的方法。
解決方案一:
建立一個輔助類,用于儲存所有的已打開的Activity,當打開一個Activity時,就将其添加到已打開的Activity集合中(通常是onCreate()方法中調用add方法),當關閉一個Activity時,需要在集合中删除該Activity(通常是onDestroy()方法中調用delete方法)。關鍵代碼如下:
public class ActivityMgr extends Application {
private static ActivityMgr activityMgr = null;
public List activities = new LinkedList();
public synchronized static ActivityMgr getInstance() {
if (null == activityMgr) {
activityMgr = new ActivityMgr();
}
return activityMgr;
}
public void addActivity(Activity activity) {
if (activity != null) {
activities.add(activity);
}
}
public void exit() {
for (Activity activity : activities) {
System.out.println("Activity="+activity);
if (activity != null) {
activity.finish();
}
}
System.exit(0);
}
public void delete(Activity activity){
if(activities.contains(activity)){
activities.remove(activity);
System.out.println("Delete!");
}
}
public void onLowMemory() {
super.onLowMemory();
System.gc();
}
}
在Activity的onCreate()方法中将Activity本身添加到集合中的語句如下:
ActivityMgr.getInstance().addActivity(this);
在Activity的onDestroy()方法中,将Activity從集合中删除的語句如下:
protected void onDestroy() {
ActivityMgr.getInstance().delete(this);
super.onDestroy();
}
解決方案二:
通過發送廣播的方式,通知所有的Activity進行關閉,具體做法建立一個自定義的MyActivity讓其繼承于Activity,在該Activity中定義一個内部廣播接收器類,然後在onResume()方法中進行動态注冊廣播接收器。最後讓其他的Activity繼承于MyActivity而不是系統的Activity,這樣所有的Activity類都繼承了MyActivity中的onResume()方法,也就注冊了廣播接收器,當需要退出應用程式時,隻需要發送一個廣播即可,這時所有的Activity的内部廣播接收器都可以接收到該廣播,然後執行finish()方法,結束Activity本身。
public class MyActivity extends Activity {
ExitBroadcastReceiver exitReceiver;
private class ExitBroadcastReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent) {
finish();//結束目前的Activity
unregisterReceiver(exitReceiver);//取消注冊
}
}
protected void onResume() {
exitReceiver=new ExitBroadcastReceiver();//建立廣播接收器
IntentFilter filter=new IntentFilter("iet.jxufe.cn.android.exit");//過濾條件
registerReceiver(exitReceiver, filter);//注冊廣播接收器
super.onResume();
}
}
需要退出時,隻需要發送廣播即可。代碼如下:
Intent intent=new Intent();
intent.setAction("iet.jxufe.cn.android.exit");//設定接收廣播的條件
sendBroadcast(intent);//發送廣播
解決方案三:
通過Activity的啟動模式來實作該功能,Activity的啟動模式主要有以下幾種:
1、standard模式;也就是預設模式,每次激活Activity時都會建立一個新的Activity執行個體,并放入任務棧中。
2、singleTop模式;如果在任務棧中的棧頂存在該Activity執行個體,下次激活該Activity執行個體時就不會建立新的 Activity的執行個體,直接重用它(在重用的這個過程中會調用執行個體的OnNewIntent()這個方法),否則就建立新的Activity執行個體。
3、singleTask模式;如果在棧中已經有該Activity的執行個體,以後就不會建立新的執行個體了,而會重用該執行個體(在重用的這個過程中會調用執行個體的OnNewIntent()這個方法)。重用時,如果該Activity執行個體不是在棧頂,它會讓該執行個體回到棧頂,而它上面的執行個體将會被移出棧。如果棧中不存在該執行個體,将會建立新的執行個體放入棧中。
4、singleInstance模式;在一個新棧中建立該Activity的執行個體,并讓多個應用共享該棧中的該Activity執行個體。一旦該模式的Activity執行個體已經存在于某個棧中,任何應用再激活該Activity時都會重用該棧中的執行個體( 會調用執行個體的 onNewIntent() )。其效果相當于多個應用共享一個應用,不管誰激活該 Activity 都會進入同一個應用中。
在這裡我們可以把主activity設定為singleTask模式,當我們想退出整個應用時,就可以通過intent打開該activity,然後系統會把它之上的activity移出activity棧,然後我們再在該activity的onNewIntent方法進行finish,就可以達到退出該應用程式的目的。
該方案有一定的局限性,僅适應于有一個固定的Activity作為棧底的情況,如果棧底元素不是固定的,則有可能達不到該效果。例如若此時棧中并不存在該執行個體對象,則會建立一個新的對象,也就達不到關閉其他Activity的目的。
Activity的啟動模式可以在清單檔案中進行配置,例如:
android:name="MainActivity"
android:label="@string/title_activity_main"
android:launchMode="singleTask" >
在MainActivity中重寫onNewIntent()方法,執行finish()方法,代碼如下:
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
this.finish();
}
在需要退出整個應用時,建立一個Intent,跳轉到MainActivity即可,此時由于MainActivity處于棧底,它上面的所有的Activity都會銷毀,并會調用MainActivity的onNewIntent()方法。