在Android开发的过程中遇到一个奇怪的问题:在内存不足的情况下,发生LMK后,再次进入Camera,新创建的相机预览取景框为上一次编辑图片画面。
Android 4.1中, Gallery2 与Camera被放置到同一个包com.android.gallery3d里
在Gallery2中的一个activity中,有下面定义,这样会创建一个子进程
<activity android:name="com.android.gallery3d.photoeditor.PhotoEditor"
android:label="@string/app_name"
android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen"
android:configChanges="keyboardHidden|orientation|screenSize"
android:hardwareAccelerated="true"
android:process=":edit">
用PS命令可以看到com.android.gallery3d:edit的进程
由于图片编辑界面比较占内存,程序初始设计者估计也是基于这个考虑才创建子进程来实现吧!
但是,多开一个进程,会引发LMK,把com.android.gallery3d进程杀掉,使得从图片编辑界面返回上一界面,即com.android.gallery3d进程时;
这个问题log中没有其他的异常信息,除了
09-02 15:22:16.498 <4>0[17304.912537] [LMK] select 12350 (droid.gallery3d), adj 7, size 12936, to kill
09-02 15:22:16.498 <4>0[17304.912553] [LMK] send sigkill to 12350 (droid.gallery3d), adj 7, size 12936
修改方法:
去掉android:process=":edit" ,让PhotoEditor跟Camera、Gallery3d 在同一个进程里就没有这个问题了(即时发生LMK,也不会杀死进程本身)。
Android是支持多进程的,每个进程的内存使用限制一般为24MB的内存,所以当完成一些很耗费内存的操作如处理高分辨率图片时,需要单独开一个进程来执行该操作(上面的配置可以用来实现该操作)。即便如此,开发者还是不要随意多开进程来耗费用户的资源。(内存限制,有16MB,24MB, 32MB,很老的机型的内存限制会是16MB,这个具体还要再搜索下资料。。)