关于如何深度手动管理activity
手动去管理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对象,单例也有可能被回收。
有更好的想法可以在下方留言。
谢谢观看