点滴记录 -- 自定义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 或者 直接使用
看看baseactivitypublic 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();就可以了,相信直接使用你也会了吧?
相关文章推荐
- 【点滴记录】如何设置outlook的代理
- sharepoint 2010 自定义列表启用版本记录控制 如何在修改数据不产生新版本
- sharepoint 2010 自定义列表启用版本记录控制 如何在修改数据不产生新版本
- Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库 自定义日志记录功能,按日记录,很方便 C#常量和字段以及各种方法的语法总结 类型,对象,线程栈,托管堆在运行时的关系,以及clr如何调用静态方法,实例方法,和虚方法 asp.net webapi 自定义身份验证
- [转]Writing Custom Entries to the Audit Log in Windows SharePoint Services 3.0(如何记录自定义审核日志)
- Win10系统如何打开OneNote云笔记记录生活点滴
- APM如何将自定义变量的数据记录到log日志里
- 如何用工作流向队列项中放入自定义实体记录
- 如何自定义Attribute class并将其应用到相应的class
- 点滴记录——Ubuntu 自动挂载windows分区
- 如何自定义 maven中的archetype
- 如何在xml中配置自定义view以及使view动起来
- vs如何添加自定义字体
- 有一个队列 ABCDEFG, 现有一个堆栈, 有三种操作, 出队, 入栈,出栈. 输出可以是出队操作也可以是出栈操作.试问如何判断某一序列不是无法输出的?
- SQL如何删除表中空记录
- 如何随机取记录?(MSSQL、Access、MySql)
- Hibernate中如何使用count(*)取得表中记录总数
- 如何消除Windows 7中的搜索记录
- 在android中如何自定义ViewGroup
- Silverlight自定义数据绑定控件应该如何处理IEditableObject和IEditableCollectionView对象