天天看點

Android退出整個應用之完美解決方案Android中Activity啟動模式詳解

之前寫過一些退出整個activity的方法,但都很繁瑣而且效果不是很好。

經過這段時間的學習和應用又有了新的方法。個人感覺很不錯很完美的方法。

對于網上所提供的殺程序,殺包等方式不予評價,這裡提供一下自己覺得挺好使的二種方法,和大家一起進行分享。

一:利用全局容器

android提供了一個類似于EE中的servletContext的東西-Application。

在application裡面我們通常會進行建立一些全局變量或者對應用程式進行一些必要的初始化。

第一個方法的思路就在于,我們可以在application裡面建立一個集合容器,用于記錄每個打開的activity,一旦我們有退出整個應用程式的需求的時候,我們就可以疊代該集合容器,把該容器裡面儲存的activity依次關閉。

核心代碼如下,詳細代碼見附件一

Android退出整個應用之完美解決方案Android中Activity啟動模式詳解

public class BaseApp extends android.app.Application {  

public static Stack<Activity> activitys = new Stack<Activity>();  

/* 

* @see android.app.Application#onCreate() 

*/  

@Override  

public void onCreate() {  

// TODO Auto-generated method stub  

super.onCreate();  

}  

public static void pushActivity(Activity mActivity) {  

activitys.add(mActivity);  

public static void popAll() {  

while (!activitys.isEmpty()) {  

Activity act=activitys.pop();  

act.finish();  

這個不解釋。

二:利用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棧,然後我們再在該activity的onnewIntent方法進行finnish,那麼我們就可以相對完美的退出該應用程式。

核心代碼如下,詳細見附件二:

Android退出整個應用之完美解決方案Android中Activity啟動模式詳解

public class MainActivity extends Activity {  

public void onCreate(Bundle savedInstanceState) {  

super.onCreate(savedInstanceState);  

TextView tv = new TextView(this);  

tv.setText("我是第一個activity");  

tv.setLayoutParams(new LayoutParams(100, 200));  

tv.setOnClickListener(new View.OnClickListener() {  

public void onClick(View v) {  

Intent intent = new Intent(MainActivity.this,  

MainActivity02.class);  

startActivity(intent);  

});  

setContentView(tv);  

public boolean onCreateOptionsMenu(Menu menu) {  

getMenuInflater().inflate(R.menu.activity_main, menu);  

return true;  

* @see android.app.Activity#onNewIntent(android.content.Intent) 

protected void onNewIntent(Intent intent) {  

super.onNewIntent(intent);  

finish();  

@Override  protected void onNewIntent(Intent intent) {  // TODO Auto-generated method stub  super.onNewIntent(intent);  finish();  } 

AndroidManifest.xml

<activity

            android:name="com.putao.accountbook.MainActivity"

            android:launchMode="singleTask"

            android:label="@string/app_name" >

簡而言之就是将要退出整個應用的activity設定成單例啟動模式。然後重寫onNewIntent(Intent intent) 方法。

附帶說明

  在Android中每個界面都是一個Activity,切換界面操作其實是多個不同Activity之間的執行個體化操作。在Android中Activity的啟動模式決定了Activity的啟動運作方式。

  Android總Activity的啟動模式分為四種:

<a></a>

希望對大家有幫助

繼續閱讀