加载中…
正文 字体大小:

android 透明的Activity退出后,没有真正finish的问题

(2010-12-17 09:07:17)
标签:

it

分类: 软件开发
考虑两个Activity,A调用B。按Back键退出B后,测试发现B的行为如下表所示:
----------------------------------------------------------------------------------
                   B.onPause()       B.onStop()      B.onDestroy()
1   不透明    不透明                                              Y
2   不透明    透明                                                N
3   透明      不透明                                              Y
4   透明      透明                                                Y
----------------------------------------------------------------------------------
注:(1)透明 指的是activity使用 Theme.Translucent.*
    (2)Y:被调用;N:未被调用。

    上表中,情况2很奇怪,B的onStop(),onDestroy()没有被调到,也就是说,B没有被finish掉,surface也没有被destroy,B仍然占用内存。

    情况2正是目前项目所用的方案。A是不透明的,原因是:在A透明的情况下并不能实现真正的全屏,系统任务栏仍然存在,这是另外一个问题,此处不做展开讨论。

    回到本文的主题,值得注意的是:对于情况2,通过android程序菜单直接运行B,然后按Back键退出B后,onStop(),onDestroy()却可以被正确调到,finish成功。

    在测试了startActivity()所用的Intent的相关flags后,仍然不能解决问题。最后通过查看Launcher的源码,终于发现了问题所在:
Launcher使用了Theme.Wallpaper.NoTitleBar;
关键属性:<item name="android:windowShowWallpaper">true</item>

在A中加入这个属性后,问题解决。android文档里对这个属性的解释是:
public static final int windowShowWallpaper
Since: API Level 5
Flag indicating that this window's background should be the user's current wallpaper.

    另外,在讲Activity生存期的文档里,并没有提到这个属性,按道理来讲,不应该导致此问题。暂时还没有找到真正的控制逻辑,初步猜测可能是透明的Activity的优先级比较高导致,或者是android系统的一个不太完善的地方。
    总之,还是要感谢Google将android开源,始终可以通过查看源码解决此类问题。

0

阅读 评论 收藏 转载 喜欢 打印举报
已投稿到:
  • 评论加载中,请稍候...
发评论

       

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有