Android 系统回收处理

# Android APP回收

1.  Application回收

测试环境:

a). 新建一个Android工程,自定义一个Application和Activity A、B,启动入口为A,A启动后,立即启动B;

b). B启动后,按home键放入后台,在开发环境DDMS中点击关闭进程,然后回到手机桌面,点击APP图标进入应用;

测试现象:

a)、执行了Application的onCreate方法,执行了Activity B的onCreate方法,**并没有执行Activity A的onCreate方法**

#### 结论:

a)、Application被系统回收后,再次进入APP,APP会启动Application和被回收前(Task顶)的Activity

b)、在Application建议不要存成员变量、静态变量、数组、数据结构等与Activity、Service、fragment等常用组件生命周期相关的数据。

c)、Application中能够维护的是,和ApplicationContext生命周期一致的组件和数据,如lib库的初始化,Toast显示、关闭等。

d)、两个组件之前的数据传递,应该使用intent传值,setResult、eventbus、广播等其他方式进行传递,不要讲要传递的数据保存在Appcation里面去做读取操作。

e)、不建议在Application中保存对有Activity、Service、fragment等有生命周期的系统组件或其它被管理的组件持有引用,因为这样做有可能会带来一定的内存泄漏,需要妥善引用和释放。

2. Activity回收机制

Activity的回收处理在日常项目中相对比较容易处理,重写onSaveInstanceState方法,存入需要保存的数据,在onCreate中取出保存数据即可。

a).切换到后台时,依次执行onPause 、onSaveInstanceState 、onStop方法;

b).进入系统设置,切换系统语言,在回到桌面,启动应用,当前activity开始重启

c).activity在重启时,依次执行onDestroy、onCreate、onStart、onRestoreInstanceState、onResume方法。

#### 结论

可以将每一个Activity作为单独的模块来处理,这个模块的输入,输出。并且在他的生命周期中,能接受人机交互的数据输入和其它组件(如广播,Service、接口回调)的传值,这部分数据暂称为过程中输入。当然它也可以发送事件到其它组件去,这里暂不讨论。

a).输入:建议使用Intent传值,在activity被回收后重启时,仍然能从getIntent中获取到输入

b).输出:建议使用setResult方式输出,startActivityFroResult启动的Activity B, 系统被重启后,仍然能通过setResult将Activity B中的数据返回到A的onActivityResult中(如果用广播需要使用粘性广播)

c).过程中输入,这部分的数据需要开发者根据Activity的业务流程选择性或是全部存储到onSaveInstanceState中,在onCreate方法里面,如果savedInstanceState参数不为空,则表示该activity是被系统重启过了的activity,需要从savedInstanceState取出数据,恢复activity状态。

3. Fragment回收机制

Fragment一般会被Activity加载,所以当Activity被重启时,所以Fragment的回收机制需要首先在Activity里面处理

Activity中处理如下代码:

'' if (savedInstanceState == null) {

''  BackUpFragment f = BackUpFragment.newInstance("testbackUp");

''            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();

''            fragmentTransaction.replace(R.id.fg_backup, f, "tag");

''            fragmentTransaction.commit();

''        } else {

''            BackUpFragment f = (BackUpFragment) getSupportFragmentManager().findFragmentByTag("tag");

''            if (f == null) {

''                // 创建fragment

''                f = BackUpFragment.newInstance("testbackUp");

''                FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();

''                fragmentTransaction.replace(R.id.fg_backup, f, "tag");

''                fragmentTransaction.commit();

''            }

''        }

需要注意的时候,将Fragment放入容器时,记得设置Tag,重启时可以根据Tag找到Fragment

Fragment中的处理代码为:

'' @Override

''    public View onCreateView(LayoutInflater inflater, ViewGroup container,

''                              Bundle state) {

''        if (state != null) {

''            LogUtils.v("true");

''            mData = state.getString("key");

''        } else {

''            LogUtils.v("false");

''        }

''        View rootView = inflater.inflate(R.layout.fg_backup, container, false);

''

''        TextView tv = (TextView) rootView.findViewById(R.id.tv_fg_show);

''        tv.setText(mData);

''        return rootView;

''

''    }

''

'' @Override

''    public void onSaveInstanceState(Bundle outState) {

''        super.onSaveInstanceState(outState);

''        outState.putString("key", mData);

''    }

另外在Fragment嵌套在ViewPager的时候,并非自己添加fragment到FragmentManager中的情况,

需要查看下层代码在添加时是否有给Fragment设置tag,如果设置,则可以在重启后通过代码找到Fragment:

'' if (savedInstanceState != null) {

''            for (int i=0; i<4; i++) {

''                BackUpFragment fragment = (BackUpFragment)

''                        getSupportFragmentManager().findFragmentByTag("android:switcher:" + pager.getId() + ":" + i);

''                if (fragment == null) {

''                    fragment = BackUpFragment.newInstance("fragment" + i);

''                } else {

''                    LogUtils.v("TableLayoutFragmentActivity getBackUp fragment "+i);

''                }

''                mFragmentList.add(fragment);

''            }

''        } else {

''            for (int i=0; i<4; i++) {

''                BackUpFragment fragment = BackUpFragment.newInstance("fragment"+i);

''                mFragmentList.add(fragment);

''            }

''        }

####结论

Fragment回收策略的考虑比Activity麻烦,总结而言有两点:

a).添加Fragment的时候记得给Tag,在Activity中通过fragment通过Tag找到可以使用的Fragment

b).在Fragment中通过onSaveInstanceState方法保存过程输入数据,重启后在onCreateView中获取过程输入数据

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容

  • Android: 五种布局: FrameLayout 、 LinearLayout 、 AbsoluteLayou...
    _痞子阅读 576评论 0 0
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,074评论 25 707
  • 无形则无价 如:信任的价值; 信任起源于对一件事或一个人所产生的绝对认可!而要让信任持续下去的唯一要素就是“事或人...
    萍空间阅读 72评论 0 0
  • 2017年2月14日,希望能够每天通过简书输出一些当天阅读、总结的东西,包括中文的、英文的、整段文字、一个句子、一...
    求实engineer阅读 213评论 0 0
  • 项目管理所需要的技能纷繁复杂,但对进度的把控和风险的识别是其中的重要环节,项目周期有长有短,过程中状况频发,需要标...
    一箭阅读 11,704评论 5 27