最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2016年04月12日 08:47:31   作者:段殘夢  
這篇文章主要介紹了退出Android程序時清除所有activity的實現(xiàn)方法,詳細(xì)分析了Android退出時清除activity的原理與實現(xiàn)技巧,需要的朋友可以參考下

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

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

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

先做以下幾點說明:

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

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

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

(4)為了減少代碼的重復(fù)性,我們可以在實際操作時,自定義一個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時,也進(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();
    }
  }
}

再看看我們自定義的一個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); 等相關(guān)代碼了。

在android 2.1以上的版本都能實現(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é)

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

相關(guān)文章

最新評論

乌拉特中旗| 璧山县| 蒲城县| 利津县| 定西市| 安平县| 理塘县| 万安县| 阿尔山市| 阳谷县| 义马市| 武宣县| 柘荣县| 江都市| 安宁市| 梨树县| 陆丰市| 庄浪县| 延津县| 商都县| 扎赉特旗| 乐平市| 广州市| 石柱| 盘山县| 通州区| 祁连县| 谢通门县| 行唐县| 历史| 元氏县| 尚义县| 时尚| 金堂县| 靖西县| 长寿区| 青川县| 秦皇岛市| 山丹县| 临泉县| 佛坪县|