关于如何深度手动管理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对象,单例也有可能被回收。

有更好的想法可以在下方留言。

谢谢观看



原创粉丝点击