技術退出android程式清除所有activity

來源:互聯網
上載者:User

 轉自:http://huangxingzhe.iteye.com/blog/1390507

 

在一個項目中,要退出android程式,試了restartPackage、 killBackgroundProcesses 、通過異常並在Application的子類中重新註冊Thread的 Thread.UncaughtExceptionHandler介面+異常方式,等等,都沒有效果。

最後發現其實只要在從一個activity A 跳到另一個activity B 時,調用了A的finish方法,程式就能退出,但這樣不能實現Back操作了,最後想一個辦法:我們為什麼不自己控製程序建立的activity呢?比如我們可以把程式建立的avtivity放在一個全域變數裡,在退出程式的時候取出每個還存在的activity,並對每個activity依次調用finish最後程式就正常退出了。

先做以下幾點說明:

(1)我們可以重寫一個Activity管理類ActivityManager,裡面有一個堆棧結構,用來存放使用者顯示的activity,並暴露幾個方法,一個向堆棧結構中加入Activity,它主要用來當建立一個Activity時加入堆棧,另外一個從堆棧結構中取出一個Activity,當使用者調用Back按鍵時,要從堆棧中刪除無用的activity,最後定義一個系統退出時清空activity方法,並在清空Activity時調用每個Activity的finish方法完成記憶體資源的釋放。

(2)為了共用複雜的資料類型,我們可以採用重寫Application類的方法,在這個類裡面定義一個成員---Activity管理類ActivityManager,這樣它就可以被所有的Activity共用了。

(3)在適當的時候我們調用ActivityManager的入堆棧操作和出堆棧操作就行了。比如,在我的需求裡,我在onCreate時調用入堆棧操作,在使用者進行點擊Back按鍵時進行出堆棧操作。

(4)為了減少代碼的重複性,我們可以在實際操作時,自訂一個Activity基類,重寫裡面的onCreate()方法和onBackPressed方法,onCreate方法裡我們把當前的Activity放入自訂ActivityManager,onBackPressed我們將當前Activity從ActivityManager中彈出。

先看ActivityManager類主要代碼。

import java.util.Stack; public class ActivityManager {     private static Stack<Activity> activityStack;     private static ActivityManager instance;     private ActivityManager() {     }     public static ActivityManager getScreenManager() {         if (instance == null) {             instance = new ActivityManager();         }         return instance;     }     //退出棧頂Activity     public void popActivity(Activity activity) {         if (activity != null) {            //在從自訂集合中取出當前Activity時,也進行了Activity的關閉操作             activity.finish();             activityStack.remove(activity);             activity = null;         }     }     //獲得當前棧頂Activity     public Activity currentActivity() {         Activity activity = null;        if(!activityStack.empty())          activity= activityStack.lastElement();         return activity;     }     //將當前Activity推入棧中     public void pushActivity(Activity activity) {         if (activityStack == null) {             activityStack = new Stack<Activity>();         }         activityStack.add(activity);     }     //退出棧中所有Activity     public void popAllActivityExceptOne(Class cls) {         while (true) {             Activity activity = currentActivity();             if (activity == null) {                 break;             }             if (activity.getClass().equals(cls)) {                 break;             }             popActivity(activity);         }     } } 

再看看自訂的Application類,有關網路連接處理的代碼可以忽略不管。

public class ApplicationEx extends Application {     private static final String TAG = "ApplicationEx";     private HttpClient httpClient; //採用apache網路連接組件     private ActivityManager activityManager = null;     public ApplicationEx() {     }     public ActivityManager getActivityManager() {         return activityManager;     }     public void setActivityManager(ActivityManager activityManager) {         this.activityManager = activityManager;     }     @Override     public void onCreate() {         super.onCreate();         httpClient = createHttpClient();       //初始化自訂Activity管理器         activityManager = ActivityManager.getScreenManager();     }     @Override     public void onLowMemory() {         super.onLowMemory();         shutdownHttpClient();     }     @Override     public void onTerminate() {         super.onTerminate();         shutdownHttpClient();     }     private void shutdownHttpClient() {         if (httpClient != null && httpClient.getConnectionManager() != null) {             httpClient.getConnectionManager().shutdown();         }     }     private HttpClient createHttpClient() {         Log.d(TAG, "createHttpClient()...");         HttpParams params = new BasicHttpParams();         HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);         HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);         HttpProtocolParams.setUseExpectContinue(params, true);         SchemeRegistry schReg = new SchemeRegistry();         schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));         schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));        //解決多線程訪問安全問題         ClientConnectionManager connectionManager = new ThreadSafeClientConnManager(params, schReg);         return new DefaultHttpClient(connectionManager, params);     }     public HttpClient getHttpClient() {         if (httpClient != null) {             return httpClient;         } else {             return createHttpClient();         }     } } 

再看看我們自訂的一個Acitivity基類。

public abstract class AbstractTemplateActivity extends Activity {     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         ApplicationEx application = (ApplicationEx) this.getApplication();         application.getActivityManager().pushActivity(this);           }       @Override     public void onBackPressed() {         super.onBackPressed();         ApplicationEx application = (ApplicationEx) getApplication();         application.getActivityManager().popActivity(this);     }    } 

這樣只我們的Activity都繼承AbstractTemplateActivity ,我們就不需要在每個Activity中寫    ApplicationEx application = (ApplicationEx) this.getApplication();       application.getActivityManager().pushActivity(this); 等相關代碼了。

在android 2.1以上的版本都能實現Activity的完全退出。
原文連結:http://blog.csdn.net/sgl870927/article/details/6281971

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.