使用弱引用的activity栈管理机制
来源:互联网 发布:国际医疗人工智能大会 编辑:程序博客网 时间:2024/05/17 07:48
在开发过程中,我们常常会用到一个常用的东西,就是activity栈,这个东西得作用就是处理逻辑,在某些情况下直接可以将所有的activity关闭,或者只保留1个指定的activity。
但是很多的栈管理器都是使用强引用写的,这样就容易引起app崩溃,因为activity在某些时候回被系统回收,然后返回后重新创建,这时弱引用的优势就来了,就是他不会直接使用该对象(强引用会),你可以判断他要使用的对象是否为空,这时,很多的崩溃情况就可以被避免了,下面上代码:
/** * Author: 姚智胜 * Version: V1.0版本 * Description: activity栈管理器 * Date: 2017/04/22. */public class ActivityStackManager { private static final String TAG = "ActivityStackManager"; /** * Activity栈 */ private Stack<WeakReference<Activity>> mActivityStack; private static ActivityStackManager activityStackManager = new ActivityStackManager(); private ActivityStackManager() { } /*** * 获得AppManager的实例 * * @return AppManager实例 */ public static ActivityStackManager getInstance() { if (activityStackManager == null) { activityStackManager = new ActivityStackManager(); } return activityStackManager; } /*** * 栈中Activity的数 * * @return Activity的数 */ public int stackSize() { return mActivityStack.size(); } /*** * 获得Activity栈 * * @return Activity栈 */ public Stack<WeakReference<Activity>> getStack() { return mActivityStack; } /** * 添加Activity到堆栈 */ public void addActivity(WeakReference<Activity> activity) { if (mActivityStack == null) { mActivityStack = new Stack<>(); } mActivityStack.add(activity); } /** * 删除ac * * @param activity 弱引用的ac */ public void removeActivity(WeakReference<Activity> activity) { if (mActivityStack != null) { mActivityStack.remove(activity); } } /*** * 获取栈顶Activity(堆栈中最后一个压入的) * * @return Activity */ public Activity getTopActivity() { Activity activity = mActivityStack.lastElement().get(); if (null == activity) { return null; } else { return mActivityStack.lastElement().get(); } } /*** * 通过class 获取栈顶Activity * * @param cls * @return Activity */ public Activity getActivityByClass(Class<?> cls) { Activity return_activity = null; for (WeakReference<Activity> activity : mActivityStack) { if (activity.get().getClass().equals(cls)) { return_activity = activity.get(); break; } } return return_activity; } /** * 结束栈顶Activity(堆栈中最后一个压入的) */ public void killTopActivity() { try { WeakReference<Activity> activity = mActivityStack.lastElement(); killActivity(activity); } catch (Exception e) { Log.e(TAG, e.getMessage()); } } /*** * 结束指定的Activity * * @param activity */ public void killActivity(WeakReference<Activity> activity) { try { Iterator<WeakReference<Activity>> iterator = mActivityStack.iterator(); while (iterator.hasNext()) { WeakReference<Activity> stackActivity = iterator.next(); if (stackActivity.get() == null) { iterator.remove(); continue; } if (stackActivity.get().getClass().getName().equals(activity.get().getClass().getName())) { iterator.remove(); stackActivity.get().finish(); break; } } } catch (Exception e) { Log.e(TAG, e.getMessage()); } } /*** * 结束指定类名的Activity * * @param cls */ public void killActivity(Class<?> cls) { try { ListIterator<WeakReference<Activity>> listIterator = mActivityStack.listIterator(); while (listIterator.hasNext()) { Activity activity = listIterator.next().get(); if (activity == null) { listIterator.remove(); continue; } if (activity.getClass() == cls) { listIterator.remove(); if (activity != null) { activity.finish(); } break; } } } catch (Exception e) { Log.e(TAG, e.getMessage()); } } /** * 结束所有Activity */ public void killAllActivity() { try { ListIterator<WeakReference<Activity>> listIterator = mActivityStack.listIterator(); while (listIterator.hasNext()) { Activity activity = listIterator.next().get(); if (activity != null) { activity.finish(); } listIterator.remove(); } } catch (Exception e) { Log.e(TAG, e.getMessage()); } } /** * 移除除了某个activity的其他所有activity * * @param cls 界面 */ public void killAllActivityExceptOne(Class cls) { try { for (int i = 0; i < mActivityStack.size(); i++) { WeakReference<Activity> activity = mActivityStack.get(i); if (activity.getClass().equals(cls)) { break; } if (mActivityStack.get(i) != null) { killActivity(activity); } } } catch (Exception e) { Log.e(TAG, e.getMessage()); } } /** * 退出应用程序 */ public void AppExit(Context context) { killAllActivity(); Process.killProcess(Process.myPid()); }}
赶快试试吧,如果你感兴趣,可以看看我在github的开源项目:
直通车
仿微信朋友圈9图上传选择器
YzsLib快速开发框架
YzsBaseActivity-baseActivity框架
里面有很多实用的东西去看看吧,喜欢的话给个star呀
本博客不定期更新╮(╯▽╰)╭╮(╯▽╰)╭
2 0
- 使用弱引用的activity栈管理机制
- 14-ARC自动引用内存使用及管理机制
- 自定义Activity管理机制
- Android Activity管理机制详解
- 强引用,软引用,弱引用,虚引用的使用
- iOS内存管理机制及属性的使用
- 使用制作UGUI的UI流程管理机制
- 引用activity之外的控件
- Java 强引用 软引用 弱引用的使用
- handler的性能优化之弱引用持有activity
- 使用自定义的Activity栈来管理android的Activity
- 使用自定义的Activity栈来管理android的Activity
- 使用自定义的Activity栈来管理android的Activity
- Android中的内存管理机制以及正确的使用方式
- Debian使用的dpkg与apt-get软件管理机制详解
- Android中的内存管理机制以及正确的使用方式
- Android中的内存管理机制以及正确的使用方式
- Android 软引用和弱引用的使用分析
- 1119. Pre- and Post-order Traversals (30)
- RecyclerView下拉刷新上拉加载更多--EasyRecyclerView
- logback 配置详解(一)
- 一个FTP客户端demo
- centos6安装redis3.2.5
- 使用弱引用的activity栈管理机制
- 保留多行文本框的换行与空格样式,并转义HTML标记的尖括号
- 基础问题 更新0.1
- 【记录】JS在TextArea光标位置插入文字+移动光标到文字末尾
- Qt之实现表针时钟小工具
- 4 款实用的网页设计开源工具【附下载】
- Java 正则表达式
- 数据库的最简单实现
- mysql入门(基础要打好啊~)