<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255); font-size: 18px;">前段时间,在公司项目中,有过这样的一个需求需要在某中状态下,对本应用所有的Activity都要finished掉。</span>
起初想到能解决的方案有两个:一、在应用中每个Activity都加上一个BroadcastReceiver,通过接收广播finished调自己;二、通过使用一个工具来管理所有打开的Activity,然后收到触发之后,调用所有的Activity实例来finished掉自己。
第一种方案,可以解决问题,但使用了大量的BroadcastReceiver,也会导致主线程缓慢;
第二种方案,是在网上一兄弟共享的工具类,通过使用一个单例开启一堆栈来管理所打开的类,但是这样也会导致整个应用处理事务来非常缓慢,应用的开启也非常缓慢。不知这是怎么回事?正在探索中,发此博文,除了记录一下个人的经验之外,也望能得到大神们的指点。
**
* 应用程序Activity管理类
*
* @author liux
*/
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();
if (activity != null) {
activity.finish();
activity = null;
}
}
/**
* 结束指定的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) {
}
}
}