標籤:
一、思路和方法:
首先建立一個ActivityManager類來存放Activity的對象。
返回ActivityManager的對象,供BaseActivity來進行操作。
所有其他子Activity都繼承BaseActivity。
二、代碼實現
ActivityManager 類:
package com.example.mydemo;import java.lang.ref.SoftReference;import java.util.HashMap;import java.util.Iterator;import java.util.Map.Entry;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.util.Log;public class ActivityManager { /** * 注意,此處為單例模式,在BaseActivity中,只會返回一個對象。否則,每次被繼承的BaseActivity在子Activity被建立的時候, * 都會得到一個新的對象。每個新的對象下,又會建立自己的HashMap,效果就是,一個HashMap只存了一個activity, * 顯然與我們想要的結果不一樣。 * 所以,必須使用單例模式 */ private static ActivityManager activityManager; public static ActivityManager getActivityManager() { if (activityManager == null) { activityManager = new ActivityManager(); } return activityManager; } //此處,可有可無。 private ActivityManager() { } /** * task map,用於記錄activity棧,方便退出程式(這裡為了不影響系統回收activity,所以用軟引用) */ private final HashMap<String, SoftReference<Activity>> taskMap = new HashMap<String, SoftReference<Activity>>(); /** * 往應用task map加入activity */ public final void putActivity(Activity atv) { taskMap.put(atv.toString(), new SoftReference<Activity>(atv)); Log.i("PutActivity", "" + atv); } /** * 往應用task map加入activity */ public final void removeActivity(Activity atv) { taskMap.remove(atv.toString()); } /** * 清除應用的task棧,如果程式正常運行這會導致應用退回到案頭 */ public final void exit() { for (Iterator<Entry<String, SoftReference<Activity>>> iterator = taskMap .entrySet().iterator(); iterator.hasNext();) { SoftReference<Activity> activityReference = iterator.next() .getValue(); Activity activity = activityReference.get(); Log.i("ActivityList", "" + activity); if (activity != null) { activity.finish(); } } taskMap.clear(); }}
BaseActivity的代碼:
package com.example.mydemo;import android.app.Activity;import android.os.Bundle;public class BaseActivity extends Activity { private ActivityManager manager = ActivityManager.getActivityManager(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); manager.putActivity(this); } @Override protected void onDestroy() { super.onDestroy(); manager.removeActivity(this); } public void exit() { manager.exit(); }}
子Activity只需要繼承BaseActivity 就可以了。
退出所有Activity的Activity代碼:
package com.example.mydemo;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class FragmentsActivity extends BaseActivity { private Button exit; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment); exit = (Button) findViewById(R.id.exit); exit.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub exit(); } }); }}
Android一次退出所有Activity的方法(升級版)