Android Activity被回收后的处理

  1. Activity为什么会被自动回收

处于后台App中的Activity会在系统内存不足时,被系统回收。

看看源码就知道咯~~~~当前使用的内存,超过最大内存的3/4就会开始自动回收activity呀

 // Watch for getting close to heap limit.

            BinderInternal.addGcWatcher(new Runnable() {
                @Override public void run() {
                    if (!mSomeActivitiesChanged) {
                        return;
                    }
                    Runtime runtime = Runtime.getRuntime();
                    long dalvikMax = runtime.maxMemory();
                    long dalvikUsed = runtime.totalMemory() - runtime.freeMemory();
                    if (dalvikUsed > ((3*dalvikMax)/4)) {
                        if (DEBUG_MEMORY_TRIM) Slog.d(TAG, "Dalvik max=" + (dalvikMax/1024)
                                + " total=" + (runtime.totalMemory()/1024)
                                + " used=" + (dalvikUsed/1024));
                        mSomeActivitiesChanged = false;
                        try {
                            mgr.releaseSomeActivities(mAppThread);
                        } catch (RemoteException e) {
                        }
                    }
                }
            });

2. 返回被回收的Activity时,系统如何处理。

当内存不足的时候位于后台的应用会被系统回收掉,只是保留着任务栈,再次进入的时候会恢复它们。

要注意的地方有:系统只会把ui相关的东西存起来和恢复,其他的一些成员变量都不会管。

会把生命周期和创建一样重新走一遍,这个时候得注意那些不是从onCreat这样的生命周期方法中获得的变量状态了,譬如那些运行的时候从网络获取或者是其他模块传过来的,最好在onSaveInstantstate中存起来。

注意那些子线程,一个在activity或者fragment中长期运行的子线程,会让你的组件得不到释放,并且在重新创建恢复的过程中随着状态的一些更改,譬如旧的fragment从activity中剥离了,持有旧fragment引用的子线程这个时候调用fragment的时候就会有getActivity()返回为空等问题了。


总结:模块间的数据传送,最好使用系统提供的intent这样的载体,有那些无法随着生命周期的创建被恢复的变量时尽量将它通过saveInstanceBundle保存起来,在重新创建的时候可以恢复。或者做好预防机制,比如网络请求的数据没有了,这个时候可以重新加载请求。


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值