您的位置:首页 > 其它

点滴记录 -- 自定义Activity栈 之 如何出栈

2015-05-27 17:32 302 查看

自定义Activity栈

首先自定义一个 ActivityManage

第一种 ActivityManage

感谢  http://www.360doc.com/content/14/0916/15/16319846_409925799.shtml 
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 static void popActivity() {
Activity activity = activityStack.lastElement();
if (activity != null) {
activity.finish();
activity = null;
}
}

// 退出栈顶Activity
public void popActivity(Activity activity) {
if (activity != null) {
activity.finish();
activityStack.remove(activity);
activity = null;
}
}

// 获得当前栈顶Activity
public Activity currentActivity() {
Activity activity = activityStack.lastElement();
return activity;
}

// 将当前Activity推入栈中
public static 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);
}
}
}


第二种 ActivityManage

感谢好友 开发-北京-噢耶
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实例
*
* @param cls
* @return
*/
public Activity getActivity(Class<?> cls) {
for (Activity activity : activityStack) {
if (activity.getClass().equals(cls)) {
return activity;
}
}
return null;
}

/**
* 结束当前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);
//          }
//      }
Iterator<Activity> itr = activityStack.iterator();
while(itr.hasNext()){
Activity activity = itr.next();
if(activity.getClass().equals(cls)){
itr.remove();
activity.finish();
activity = null;
}
}
}

/**
* 结束所有的Activity
*/
public void finishAllActivity() {
for (int i = 0, size = activityStack.size(); i < size; i++) {
if (null != activityStack.get(i) && !activityStack.get(i).isFinishing()) {
activityStack.get(i).finish();
}
}
activityStack.clear();
System.exit(0);
}
}


第三种 ActivityManage

public class FQYActivityManage {

private static FQYActivityManage manage;
private static Stack<Activity> activityStack;

private FQYActivityManage() {

}

/**
* 得到一个 FQYActivityManage 对象
*
* @return
*/
public static FQYActivityManage getFQYActivityManage() {
// 保证只有一个 FQYActivityManage对象
if (manage == null) {
manage = new FQYActivityManage();
}
return manage;
}

/**
* 获得当前栈顶的activity
*
* @return
*/
public Activity getCurrentStackTopActivity() {
Activity activity = null;
if (!activityStack.empty()) {
activity = activityStack.lastElement();
}
return activity;
}

/**
* 将新的activity 压栈
*
* @param activity
*/
public void pushActivity(Activity activity) {
if (activityStack == null) {
activityStack = new Stack<Activity>();
}
activityStack.add(activity);

FQYLogUtils.e("push入栈 " + activity.toString());
}

/**
* 退出栈顶 activity
*/
public void pullActivity() {

Activity lastElement = null;

if (!activityStack.empty()) {
lastElement = activityStack.lastElement();

FQYLogUtils.e("pull出栈 " + lastElement.toString());

lastElement.finish();
activityStack.remove(lastElement);
}
}

/**
* 关闭应用程序
*/
public void pullAllActivity() {
int size = activityStack.size();
for (int i = 0; i < size; i++) {
pullActivity();
size--;
}

}

}


第三种是我自己写的,这里以第三种为例继续下文,先来段题外话,网上好多第一种,但是我对popAllActivityExceptOne 很困惑,注释写的是“退出栈中所有Activity”,但是方法名(popAllActivityExceptOne)和 方法体都是保留一个指定的activity,不明白这样做的目的和用法,求指点

言归正传 ,继续主题。

重写一个Application

主要是为了方便管理activityManage(我是这么理解的,不对请指正)

public class FQYApplication extends Application {

protected FQYActivityManage activityManage;

@Override
public void onCreate() {
super.onCreate();

activityManage = FQYActivityManage.getFQYActivityManage();

}

public FQYActivityManage getActivityManage() {
return activityManage;
}

public void setActivityManage(FQYActivityManage activityManage) {
this.activityManage = activityManage;
}

}


写一个baseActivity 或者 直接使用

看看baseactivity

public class BaseActivity extends FragmentActivity {

protected Context baseContext;

protected FQYActivityManage activityManage;

@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
baseContext = this;
// 去除标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);

activityManage = ((FQYApplication) this.getApplication())
.getActivityManage();
activityManage.pushActivity(this);

}

@Override
protected void onDestroy() {
super.onDestroy();
}

@Override
public void onBackPressed() {
super.onBackPressed();
}

}


Ps: 不要在baseactivity 中执行出栈,想知道为什么?你可以试验一下。

接下来就是如何出栈了

出栈在baseactivity 的子类中执行 ,子类有FQYActivityManage的对象 activityManage(baseactivity 中 protected FQYActivityManage activityManage; ),只须在需要出栈的地方
activityManage.pullActivity();
就可以了,相信直接使用你也会了吧?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐