关于如何深度手动管理activity
来源:互联网 发布:爱情信风 网络歌手 编辑:程序博客网 时间:2024/05/22 01:30
手动去管理Activity的活动栈,一直是一个非常实用的方法。
快速方便的拿到一个Activity对象可以很方便的操作这个Activity,
可是方便的同时,也存在很多隐患:内存泄露
引起手动去管理Activity引起内存泄露的原因是:已经被内存释放掉的Activity并没有在手动创建的Activity栈中移出,这样再次调用时就会引起空指针异常,如果堆栈中的数量不断增加得不到释放,从而引发内存泄露
为应对这个问题,博主写了一个工具类,实现了手动管理Activity栈时的弊端。
Android 4.0之后,在Applicaiton中增加了一个新函数:
registerActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks callback)
这个callBack是:
public interface ActivityLifecycleCallbacks { void onActivityCreated(Activity var1, Bundle var2); void onActivityStarted(Activity var1); void onActivityResumed(Activity var1); void onActivityPaused(Activity var1); void onActivityStopped(Activity var1); void onActivitySaveInstanceState(Activity var1, Bundle var2); void onActivityDestroyed(Activity var1);}
怎么样,没有没眼前一亮的感觉
这个函数在Application中回调,每次生成一个Activity都必定会在这里走过程,这样一来,就能很容易的编写一个工具类了
public class ActivitysManager implements ActivitysLifecycleCallback { private HashMap<String,BaseAppCompatActivity> activityHashMap = new HashMap<>(); private static ActivitysManager activitysManager; public ActivitysManager(){ } public static ActivitysManager getActivitysManager(){ if(activitysManager == null){ synchronized (ActivitysManager.class){ if(activitysManager == null){ activitysManager = new ActivitysManager(); } } } return activitysManager; } /** * 插入一个activity * @param activity * @param bundle */ public void onActivityCreated(Activity activity, Bundle bundle) { String name = activity.getClass().getCanonicalName(); activityHashMap.put(name, (BaseAppCompatActivity) activity); } public void onActivityStarted(Activity activity) { } public void onActivityResumed(Activity activity) { } public void onActivityPaused(Activity activity) { } public void onActivityStopped(Activity activity) { } /** * 当前activity异常退出的情况下,删除容器中对象 * @param activity * @param bundle */ public void onActivitySaveInstanceState(Activity activity, Bundle bundle) { } public void onActivityDestroyed(Activity activity) { String name = activity.getClass().getCanonicalName(); activityHashMap.remove(name); } /** * 获取当前活动的所有Activity对象 * @return */ public List<BaseAppCompatActivity> getActivityList(){ List<BaseAppCompatActivity> activityList = new ArrayList<>(); for(String key : activityHashMap.keySet()){ activityList.add(activityHashMap.get(key)); } return activityList; } /** * 获取当前某一个Activity对象 * @return */ public BaseAppCompatActivity getActivity(String name){ if(activityHashMap.get(name) != null){ return activityHashMap.get(name); } return null; } /** * 获取当前存在的所有Activity名字 * @return */ public String[] getActivitysName(){ List<BaseAppCompatActivity> activityList = getActivityList(); String[] names = new String[activityList.size()]; for(int i = 0 ; i < activityList.size(); i ++){ names[i] = activityList.get(i).getClass().getSimpleName(); } return names; } /** * 退出程序 */ public void exit(){ List<BaseAppCompatActivity> activityList = getActivityList(); for(BaseAppCompatActivity activity : activityList){ activity.finish(); } }
在Application中实现
activitysManager = ActivitysManager.getActivitysManager();registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle bundle) { if(activitysManager != null){ activitysManager.onActivityCreated(activity,null); }else{ activitysManager = ActivitysManager.getActivitysManager(); activitysManager.onActivityCreated(activity,null); } } @Override public void onActivityStarted(Activity activity) { } @Override public void onActivityResumed(Activity activity) { } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle bundle) { } @Override public void onActivityDestroyed(Activity activity) { if(activitysManager != null){ activitysManager.onActivityDestroyed(activity); }else{ activitysManager = ActivitysManager.getActivitysManager(); activitysManager.onActivityDestroyed(activity); } }});
但是,无论怎么做,都难逃内存被回收的厄运。
单例有时候并不奏效。最坏的结果是拿不到全部的Activty对象,单例也有可能被回收。
有更好的想法可以在下方留言。
谢谢观看
阅读全文
1 0
- 关于如何深度手动管理activity
- 关于activity的管理
- Activity如何管理对话框
- 关于Activity生命周期的管理
- 关于Activity的管理类
- Activity生命周期管理~ 如何开始Activity
- 如何管理你的Activity
- 关于如何手动关闭MOTO-Defy…
- 关于深度学习如何入门?
- [Android新手学习笔记01]-如何手动创建Activity
- 关于如何管理自己
- 关于安卓的activity task管理
- 关于Activity和Fragment 的栈管理
- 关于Go语言手动管理内存的见解
- 如何去管理项目中的Activity
- AMS (3): AMS 如何管理Activity?
- 搭框架之如何管理Activity
- 手动代码创建Activity
- ImLoader
- unity\_baseLayout
- tomcat中实现非项目图片的url访问
- 通过Navicat向MySQL导入Excel文件格式数据的方法及遇到的问题
- 尼姆博弈
- 关于如何深度手动管理activity
- ajax实现跨域请求
- 后缀表达式转中缀表达式
- html基础内容样式
- 移动web开发五之商品内容主体盒子
- Linux作业进程任务管理
- notepad++编java显示不出中文,编码GBK的不可映射字符
- 数据泵导入导出语句
- js实现五种排序