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. 使用系统key文件生成keystore
  2. Android6.0系统增加那些新特性
  3. 搭建Android生产环境傻瓜教程(一)Ubuntu系统环境和常用软件
  4. System Permissions --1.4
  5. Android(安卓)P 源码分析 5 - Low memory killer 之 lmkd 守护进
  6. Android(安卓)系统(102)---Android(安卓)APP耗电优化
  7. Android系统下如何通过外设实现GPIO中断触发调用Android程序执行
  8. Android学习:进程以及优先级
  9. android构建系统总览

随机推荐

  1. Different ways to access HTTP resource
  2. android 图片点击一下就放大到全屏,再点
  3. android OS Service
  4. 捕获Android文本输入框的软键盘完成(Done
  5. ANDROID图片压缩代码
  6. Android在onCreate()中获得控件尺寸
  7. android 开源项目列表
  8. Android(安卓)Service中判断系统全屏
  9. android 方式实现imageview圆角
  10. gcc for android