国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

退出Android程序時(shí)清除所有activity的實(shí)現(xiàn)方法

2019-12-12 06:37:55
字體:
供稿:網(wǎng)友

本文實(shí)例講述了退出Android程序時(shí)清除所有activity的方法。分享給大家供大家參考,具體如下:

在一個(gè)項(xiàng)目中,要退出android程序,試了restartPackage、 killBackgroundProcesses 、通過異常并在Application的子類中重新注冊(cè)Thread的 Thread.UncaughtExceptionHandler接口+異常方式,等等,都沒有效果。

最后發(fā)現(xiàn)其實(shí)只要在從一個(gè)activity A 跳到另一個(gè)activity B 時(shí),調(diào)用了A的finish方法,程序就能退出,但這樣不能實(shí)現(xiàn)Back操作了,最后想一個(gè)辦法:我們?yōu)槭裁床蛔约嚎刂瞥绦騽?chuàng)建的activity呢?比如我們可以把程序創(chuàng)建的avtivity放在一個(gè)全局變量里,在退出程序的時(shí)候取出每個(gè)還存在的activity,并對(duì)每個(gè)activity依次調(diào)用finish最后程序就正常退出了。

先做以下幾點(diǎn)說明:

(1)我們可以重寫一個(gè)Activity管理類ActivityManager,里面有一個(gè)堆棧結(jié)構(gòu),用來存放用戶顯示的activity,并暴露幾個(gè)方法,一個(gè)向堆棧結(jié)構(gòu)中加入Activity,它主要用來當(dāng)新建一個(gè)Activity時(shí)加入堆棧,另外一個(gè)從堆棧結(jié)構(gòu)中取出一個(gè)Activity,當(dāng)用戶調(diào)用Back按鍵時(shí),要從堆棧中刪除無用的activity,最后定義一個(gè)系統(tǒng)退出時(shí)清空activity方法,并在清空Activity時(shí)調(diào)用每個(gè)Activity的finish方法完成內(nèi)存資源的釋放。

(2)為了共享復(fù)雜的數(shù)據(jù)類型,我們可以采用重寫Application類的方法,在這個(gè)類里面定義一個(gè)成員---Activity管理類ActivityManager,這樣它就可以被所有的Activity共享了。

(3)在適當(dāng)?shù)臅r(shí)候我們調(diào)用ActivityManager的入堆棧操作和出堆棧操作就行了。比如,在我的需求里,我在onCreate時(shí)調(diào)用入堆棧操作,在用戶進(jìn)行點(diǎn)擊Back按鍵時(shí)進(jìn)行出堆棧操作。

(4)為了減少代碼的重復(fù)性,我們可以在實(shí)際操作時(shí),自定義一個(gè)Activity基類,重寫里面的onCreate()方法和onBackPressed方法,onCreate方法里我們把當(dāng)前的Activity放入自定義ActivityManager,onBackPressed我們將當(dāng)前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) {      //在從自定義集合中取出當(dāng)前Activity時(shí),也進(jìn)行了Activity的關(guān)閉操作      activity.finish();      activityStack.remove(activity);      activity = null;    }  }  //獲得當(dāng)前棧頂Activity  public Activity currentActivity() {    Activity activity = null;    if(!activityStack.empty())     activity= activityStack.lastElement();    return activity;  }  //將當(dāng)前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類,有關(guān)網(wǎng)絡(luò)連接處理的代碼可以忽略不管。

public class ApplicationEx extends Application {  private static final String TAG = "ApplicationEx";  private HttpClient httpClient; //采用apache網(wǎng)絡(luò)連接組件  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();    }  }}

再看看我們自定義的一個(gè)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 ,我們就不需要在每個(gè)Activity中寫    ApplicationEx application = (ApplicationEx) this.getApplication();       application.getActivityManager().pushActivity(this); 等相關(guān)代碼了。

在android 2.1以上的版本都能實(shí)現(xiàn)Activity的完全退出。

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android通信方式總結(jié)》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android開發(fā)入門與進(jìn)階教程》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)

希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宜阳县| 吉木乃县| 木里| 成武县| 瓮安县| 吴旗县| 定州市| 舒兰市| 长岭县| 来安县| 辽阳市| 柳江县| 邵东县| 鸡泽县| 堆龙德庆县| 来宾市| 喀喇| 云阳县| 枞阳县| 浑源县| 博客| 博野县| 迁安市| 屏山县| 泸溪县| 科技| 黔西| 新津县| 喜德县| 西乌| 阿勒泰市| 宾阳县| 嫩江县| 平乡县| 汤阴县| 泾川县| 镶黄旗| 浙江省| 化州市| 襄城县| 伊宁县|