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

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

谢谢观看



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值