android开发中模拟系统内存不足 应用释放的情况

android开发中模拟系统内存不足 应用释放的情况

android的开发就是这个吊样子,什么时候释放,没有任何的消息,或者通知你,就直接把你的内存释放了。这给很多开发人员来说,都是不小的压力,往往我们开发的时候,很努力的去保存act,frag中的每一个字段,在页面恢复的时候,再恢复,来保证恢复时原来的页面的数据还在。

Application中虽然有几个方法是提示内存有些不足了,但是,仔细去测试发现他们效果还是不好,具体细节不做赘述,自行测试。

我们努力,尽心尽力的去写代码,来迎接这种不是每次都会出现的释放的问题,但是想要测试释放的问题的时候,似乎就没法再测试了,因为要再很极端的情况下系统才会把很久很久都没打开的,还在内存中的应用释放掉,那么,这样子很难进行测试。

后来我也在寻找怎么测试这个吊问题,(在南京呆惯了,喜欢用diao这个词,hahaha),我一直用的方法都是手机上安装很多很多的应用,要测项目中的某个act的时候,我都是要把这个act打开,按下home键,退到后台之后,然后打开微信,QQ,360手机助手,一堆的软件,打开之后都是按下home键让他占着内存,由于我们自己的项目是很久之前打开的,所以当系统的内存变得紧张时,系统就会按照这个顺序,把之前的我们自己的项目给释放掉。我再打开自己的项目,他就会从那个页面开始恢复。

这样子测试带来的问题,就是在大内存的手机上很难测试,然后我就不断的去google搜索有没有通过adb命令来释放的,如下是我搜到的一些结果:

查到一个命令

adb shell am force-stop 包名

但是这个的作用类似于直接杀死应用,而不是释放应用内存的感觉。

查到这个命令

adb shell  kill  应用的PID

但是报错:
Operation not permitted 操作不允许了擦擦擦

当再as(android studio的简称)的ddms面板上看到  terminates application的时候,我好像看到这个红色的“X”按钮有用,可以释放应用。

ok,这个是第一种方法。

其实我对这种方法并不感冒,我想应该有更优雅的方法。所以继续寻找更好的方案。

当我去按照AS里ddms插件里的这两个单词”terminates application”搜索的时候没搜索到可用的命令,因为搜到的和上面的几个命令都一样。

之后我又按照”terminates application”这个关键词去搜索:搜到这个帖子:
http://www.cnblogs.com/feisky/archive/2010/01/01/1637566.html

其中有这么一句话:

Immediately destroy activities:告诉系统一旦一个activity停止了就销毁该activity(例如当Android释放内存的时候)。这对于测试代码onFreeze(Bundle)/onCreate(android.os.Bundle)是非常有用的,否则会比较困难。如果你的程序没有保存状态,那么选择这个选项很可能会引发很多问题。

这个是通过 Android SDK创建的模拟器里可以用桌面的dev tools工具来释放应用进行模拟。但是其他的第三方的模拟器,比如海马玩模拟器之类的,我就不敢下定论了。

ok,这算是第二种方法。

我用as自带的 terminates application 关闭了应用,这是个窍门。
那么问题来了,那些还在使用eclipse的用户,或者使用低版本的idea开发程序员怎么办呢?对于公司的测试人员怎么办呢?他们也不习惯下载各种开发工具啊。给他拷贝一个adb让他们自己用去测试多好!!!
(+_+)

于是我想起来好像 DDMS中也有个 STOP按钮,可以直接销毁应用程序,于是我打开我的机器上的DDMS。

好吧,我的sdk是我之前从我的旧的笔记本里拷贝过来的,由于是ubuntu,很多东西都没有权限调用,我要一点点的改权限才能使用SDK目录下的一些工具。
我得一点点改文件的权限属性,caocaocao,最后在我的努力下ddms启动起来了。

我试了下stop按钮,好像效果 是一样。这个功能应该是和as,idea自带的那个关闭按钮一样的功能吧。

这个算是第三种方法。

但是。这样子 不够高端,不够装逼, 我要玩命令,我要玩命令,我要玩命令,于是慢慢在找命令。而且上面测试人员用ddms了,那他们如果不开ddms或许会有更方便的办法。直接用adb命令去测试多好!!!每次只需要按下方向键上,回到上一个命令,然后按下回车,OK了!!多爽!!!!(+_+)

停一下,我想了想,AS底部的stop按钮好像也是属于AS自带的DDMS插件。那我这么努力的去adb命令里面照好像也是没有吊用吧。

好吧!慢慢找ddms的命令吧!起码现在不用命令也能模拟应用被释放的情况了。

在google 搜索“ddms stop process”, 然后我招到了这个帖子: 点击跳转stackflow

里面提到了这个命令:

        adb shell am kill 包名

经过测试,只要应用再后台的时候,我执行这个命令释放我的项目,app就会重现应用被释放的情况。app在前台的话无法重现这个情况。

经过 测试发现 这个命令还可以释放其他非自己的项目的app,
我用命令:

 adb shell pm list packages

读取到本机安装的应用列表,然后释放掉腾讯的应用宝 ,发现也是可以的。
而不管在ddms插件下,还是ddms里面,都只能释放自己的应用。这个方法蛮 好的。

这个就是第四种方法。适用范围广,太棒了,这个才是我想要的终极方案!!!也是最优雅的方案。

还是那句话:

编程能力就是解决问题的速度和优雅度。

其实,在我最开始的时候搜索不到的时候,我也去以前的一个QQ群里询问过,不过群里面的技术水平都是中下等,我在里面一直都是回答问题的,问这个问题的时候,大家都回答不上来,还老是说好高端。cacaca 要你们何用?

so。问题解决了,其实我写了这么多不是为了告诉读者答案,而是在告诉更多的人,对于有些技术上的困难,不要轻言放弃,给自己几天得时间去查询摸索,终究会有结果。

你可能感兴趣的:(Android开发,内存,生命周期,内存管理,应用释放)