如何去管理專案中的Activity
Activity是Android系統中的四大元件之一,是使用者看得見摸得著的,可以用來顯示View,可以這樣說,幾乎所有的Activity都是和使用者進行互動的,有了Activity的存在,那些所謂Fragment,TextView等等所謂檢視,所謂的控制元件才有了自己的安身立命。話可以說的絕點,你Android技術再牛逼,沒有Activity,你一文不值,起碼現在可以這樣說。Activity的重要,是毋庸置疑的,那麼一般我們專案中都會用到多個Activity,那麼該如何對其管理呢?
public class ActivityTaskManager {
private static ActivityTaskManager activityTaskManager = null;
private HashMap<String, Activity> activityMap = null;
private ActivityTaskManager() {
activityMap = new HashMap<String, Activity>();
}
/**
* 返回activity管理器的唯一例項物件。
* @return ActivityTaskManager
*/
public static synchronized ActivityTaskManager getInstance() {
if (activityTaskManager == null) {
activityTaskManager = new ActivityTaskManager();
}
return activityTaskManager;
}
/**
* 將一個activity新增到管理器。
* @param activity
*/
public Activity putActivity(String name, Activity activity) {
return activityMap.put(name, activity);
}
/**
* 得到儲存在管理器中的Activity物件。
* @param name
* @return Activity
*/
public Activity getActivity(String name) {
return activityMap.get(name);
}
/**
* 返回管理器的Activity是否為空。
* @return 當且當管理器中的Activity物件為空時返回true,否則返回false。
*/
public boolean isEmpty() {
return activityMap.isEmpty();
}
/**
* 返回管理器中Activity物件的個數。
* @return 管理器中Activity物件的個數。
*/
public int size() {
return activityMap.size();
}
/**
* 返回管理器中是否包含指定的名字。
*
* @param name
* 要查詢的名字。
* @return 當且僅當包含指定的名字時返回true, 否則返回false。
*/
public boolean containsName(String name) {
return activityMap.containsKey(name);
}
/**
* 返回管理器中是否包含指定的Activity。
* @param activity
* 要查詢的Activity。
* @return 當且僅當包含指定的Activity物件時返回true, 否則返回false。
*/
public boolean containsActivity(Activity activity) {
return activityMap.containsValue(activity);
}
/**
* 關閉所有活動的Activity。
*/
public void closeAllActivity() {
Set<String> activityNames = activityMap.keySet();
for (String string : activityNames) {
finisActivity(activityMap.get(string));
}
activityMap.clear();
}
/**
* 關閉所有活動的Activity除了指定的一個之外。
* @param nameSpecified
* 指定的不關閉的Activity物件的名字。
*/
public void closeAllActivityExceptOne(String nameSpecified) {
Set<String> activityNames = activityMap.keySet();
Activity activitySpecified = activityMap.get(nameSpecified);
for (String name : activityNames) {
if (!name.equals(nameSpecified)) {
finisActivity(activityMap.get(name));
}
}
activityMap.clear();
activityMap.put(nameSpecified, activitySpecified);
}
/**
* 移除Activity物件,如果它未結束則結束它。
* @param name
* Activity物件的名字。
*/
public void removeActivity(String name) {
Activity activity = activityMap.remove(name);
finisActivity(activity);
}
/**
* 結束指定的Activity
* @param activity
* 指定的Activity。
*/
private final void finisActivity(Activity activity) {
if (activity != null && !activity.isFinishing()) {
activity.finish();
}
}
}
下面介紹一種用Stack來管理自己Activity
public class AppManager {
private static Stack<Activity> activityStack;
private static AppManager instance;
private AppManager(){}
/**
* 單一例項
*/
public static AppManager getAppManager(){
if(instance==null){
instance=new AppManager();
}
return instance;
}
/**
* 新增Activity到堆疊
*/
public void addActivity(Activity activity){
if(activityStack==null){
activityStack=new Stack<Activity>();
}
activityStack.add(activity);
}
/**
* 獲取當前Activity(堆疊中最後一個壓入的)
*/
public Activity currentActivity(){
Activity activity=activityStack.lastElement();
return activity;
}
/**
* 結束當前Activity(堆疊中最後一個壓入的)
*/
public void finishActivity(){
Activity activity=activityStack.lastElement();
finishActivity(activity);
}
/**
* 結束指定的Activity
*/
public void finishActivity(Activity activity){
if(activity!=null){
activityStack.remove(activity);
activity.finish();
activity=null;
}
}
/**
* 結束指定類名的Activity
*/
public void finishActivity(Class<?> cls){
for (Activity activity : activityStack) {
if(activity.getClass().equals(cls) ){
finishActivity(activity);
}
}
}
/**
* 結束所有Activity
*/
public void finishAllActivity(){
for (int i = 0, size = activityStack.size(); i < size; i++){
if (null != activityStack.get(i)){
activityStack.get(i).finish();
}
}
activityStack.clear();
}
/**
* 退出應用程式
*/
public void AppExit(Context context) {
try {
finishAllActivity();
ActivityManager activityMgr= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
activityMgr.restartPackage(context.getPackageName());
System.exit(0);
} catch (Exception e) { }
}
}
注意:在開發中這樣的Activity管理類我們寫好了,記得一定要新增,你才能刪除,最好讓所有的Activity繼承一個父類,然後再父類中新增。