-
向大家发一个Android Activity管理器,用于管理活动的Activity,可实现将一个activity添加到管理器、得到保存在管理器中的Activity对象、返回管理器的Activity是否为空、关闭所有活动的Activity除了指定的一个之外、移除Activity对象,如果它未结束则结束它、返回管理器中是否包含指定的名字,用于android开发时相当有用:
001
package
com.lurencun.cfuture09.androidkit.util.ui;
002
import
java.util.HashMap;
003
import
java.util.Set;
004
import
android.app.Activity;
005
/**
006
* 一个Activity管理器管理活动的Activity。
007
* @author Geek_Soledad (66704238@51uc.com)
008
*/
009
public
class
ActivityTaskManager {
010
private
static
ActivityTaskManager activityTaskManager =
null
;
011
private
HashMap<String, Activity> activityMap =
null
;
012
private
ActivityTaskManager() {
013
activityMap =
new
HashMap<String, Activity>();
014
}
015
/**
016
* 返回activity管理器的唯一实例对象。
017
* @return ActivityTaskManager
018
*/
019
public
static
synchronized
ActivityTaskManager getInstance() {
020
if
(activityTaskManager ==
null
) {
021
activityTaskManager =
new
ActivityTaskManager();
022
}
023
return
activityTaskManager;
024
}
025
/**
026
* 将一个activity添加到管理器。
027
* @param activity
028
*/
029
public
Activity putActivity(String name, Activity activity) {
030
return
activityMap.put(name, activity);
031
}
032
/**
033
* 得到保存在管理器中的Activity对象。
034
* @param name
035
* @return Activity
036
*/
037
public
Activity getActivity(String name) {
038
return
activityMap.get(name);
039
}
040
/**
041
* 返回管理器的Activity是否为空。
042
* @return 当且当管理器中的Activity对象为空时返回true,否则返回false。
043
*/
044
public
boolean
isEmpty() {
045
return
activityMap.isEmpty();
046
}
047
/**
048
* 返回管理器中Activity对象的个数。
049
* @return 管理器中Activity对象的个数。
050
*/
051
public
int
size() {
052
return
activityMap.size();
053
}
054
/**
055
* 返回管理器中是否包含指定的名字。
056
*
057
* @param name
058
* 要查找的名字。
059
* @return 当且仅当包含指定的名字时返回true, 否则返回false。
060
*/
061
public
boolean
containsName(String name) {
062
return
activityMap.containsKey(name);
063
}
064
/**
065
* 返回管理器中是否包含指定的Activity。
066
* @param activity
067
* 要查找的Activity。
068
* @return 当且仅当包含指定的Activity对象时返回true, 否则返回false。
069
*/
070
public
boolean
containsActivity(Activity activity) {
071
return
activityMap.containsValue(activity);
072
}
073
/**
074
* 关闭所有活动的Activity。
075
*/
076
public
void
closeAllActivity() {
077
Set<String> activityNames = activityMap.keySet();
078
for
(String string : activityNames) {
079
finisActivity(activityMap.get(string));
080
}
081
activityMap.clear();
082
}
083
/**
084
* 关闭所有活动的Activity除了指定的一个之外。
085
* @param nameSpecified
086
* 指定的不关闭的Activity对象的名字。
087
*/
088
public
void
closeAllActivityExceptOne(String nameSpecified) {
089
Set<String> activityNames = activityMap.keySet();
090
Activity activitySpecified = activityMap.get(nameSpecified);
091
for
(String name : activityNames) {
092
if
(!name.equals(nameSpecified)) {
093
finisActivity(activityMap.get(name));
094
}
095
}
096
activityMap.clear();
097
activityMap.put(nameSpecified, activitySpecified);
098
}
099
/**
100
* 移除Activity对象,如果它未结束则结束它。
101
* @param name
102
* Activity对象的名字。
103
*/
104
public
void
removeActivity(String name) {
105
Activity activity = activityMap.remove(name);
106
finisActivity(activity);
107
}
108
/**
109
* 结束指定的Activity
110
* @param activity
111
* 指定的Activity。
112
*/
113
private
final
void
finisActivity(Activity activity) {
114
if
(activity !=
null
&& !activity.isFinishing()) {
115
activity.finish();
116
}
117
}
118
}
在BlackBerry中,提供了一个管理Screen的栈,用来从任何地方来关闭位于最上一层的Screen,使用UiApplication.getUiApplication().getActiveScreen()来得到位于最上一层的Screen的实例,并且使用UiApplication.getUiApplication().popScreen()来关闭一个Screen或关闭当前最上一层的Screen,但是Android却未提供相应的功能,只能在一个Activity的对象里面调用finish来关闭自己,不能关闭其他的Activity。比如我们想实现一个功能从屏幕A—>屏幕B—>屏幕C—>屏幕D,然后在在转到屏幕D之前将屏幕B和C关闭,在屏幕B和屏幕C界面点击会退按钮都可以回退到上一个屏幕,但是在屏幕D上点击会退按钮让其回退到A,此外在一些循环跳转的界面上如果不在合适的地方将一些不需要的屏幕关闭,那么经过多次跳转后回导致内存溢出。对此我们可以设计一个全局的Activity栈,使用这个栈来管理Activity。管理Activity的类的定义如下:
import java.util.Stack;
import android.app.Activity;
public class ScreenManager {
private static Stack<Activity> activityStack;
private static ScreenManager instance;
private ScreenManager(){
}
public static ScreenManager getScreenManager(){
if(instance==null){
instance=new ScreenManager();
}
return instance;
}
public void popActivity(){
Activity activity=activityStack.lastElement();
if(activity!=null){
activity.finish();
activity=null;
}
}
public void popActivity(Activity activity){
if(activity!=null){
activity.finish();
activityStack.remove(activity);
activity=null;
}
}
public Activity currentActivity(){
Activity activity=activityStack.lastElement();
return activity;
}
public void pushActivity(Activity activity){
if(activityStack==null){
activityStack=new Stack<Activity>();
}
activityStack.add(activity);
}
public void popAllActivityExceptOne(Class cls){
while(true){
Activity activity=currentActivity();
if(activity==null){
break;
}
if(activity.getClass().equals(cls) ){
break;
}
popActivity(activity);
}
}
}