解決方案一:
創建一個輔助類,用於保存所有的已打開的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()方法。