天天看點

退出整個Android 應用的方法

通過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()方法。