Android动态壁纸服务未被销毁

3

我创建了一款动态壁纸,用户可以选择自己的文件作为背景图片。

问题在于,当我点击“设置壁纸”时,它会启动我的壁纸服务。如果我再次进入我的动态壁纸并再次点击“设置壁纸”,它似乎没有关闭先前的服务,而只是又运行了一个新的服务。这意味着每次我点击“设置壁纸”时,都会将用户SD卡中的图像读入Bitmap变量中,并且每次使用的内存都会增加,最终会抛出OutOfMemoryError。

我的onDestroy()方法将所有的Bitmap引用设置为null,并执行System.gc(),但在这种情况下,似乎在覆盖相同的壁纸时未能销毁服务。

例如,如果我已经设置好了我的壁纸,然后选择设置“Galaxy”动态壁纸,这将销毁我的壁纸服务,但当我再次设置我的壁纸时,它不会销毁原始服务。

是否有人遇到过这种情况?我应该采取不同的方法来进行nullify和垃圾回收吗?非常感谢任何帮助。

3个回答

4

在重新设置壁纸之前,需要销毁先前的壁纸。这对我很有效。并且在调用WallpaperService的Activity中销毁壁纸。在WallpaperService内部销毁会导致设备恢复默认壁纸。

WallpaperManager wallpaperManager = WallpaperManager.getInstance(getApplicationContext());
    try {
        wallpaperManager.clear();
    } catch (IOException e) {
        e.printStackTrace();
    }

希望这有所帮助。

当您从预览屏幕返回而没有设置任何壁纸时,这将同时清除您的壁纸。 - waseem

1

我相信我已经为其他遇到这个问题的人找到了解决方法。

似乎当我已经运行我的壁纸时,然后在其预览上单击“设置壁纸”,onDestroy()方法不会被调用。但是,将位图置空并调用stopSelf()可以放在onSurfaceDestroyed方法中,这似乎适用于每个打开的WallpaperService Engine实例。这可能不是正确的做法,但目前看起来还可以。

感谢GeekYouUp帮助stopSelf()。


你能完全自己写出一个方法吗? - GAAAN
stopSelf()对我没有用,我还在onSurfaceDestroyed()中删除了handler,但什么也没用。 - waseem

0

服务在完成后是否调用了stopSelf()方法?


不是的,那应该放在onDestroy()方法里吗? - William Stewart
不,它应该在服务完成你启动它的任务后调用。请阅读此文档:http://developer.android.com/reference/android/app/Service.html#ServiceLifecycle - GeekYouUp
我对我创建的一个动态壁纸运行了一些测试,发现不论我如何重新应用它,WallpaperService onCreate() 只会被调用一次,onDestory() 也只在我应用另一个壁纸时被调用一次。因此,我现在更好地理解了您的问题,但我不确定是什么原因导致了这个问题。这里是代码 http://j.mp/lNzGK1,我在 onCreate 和 onDestory 中添加了 Lod.d() 行以进行调试。有任何帮助吗? - GeekYouUp
是的,不幸的是这证实了我的想法。我已经阅读了一些资料,似乎可以运行多个WallpaperServices实例,每个实例都由自己的引擎表示,因此我认为它没有关闭先前的服务并启动新服务。目前,似乎这只是Android编码的方式。我查看了市场上一些类似的高评分和下载量的动态壁纸,它们似乎也有同样的问题,尽管没有人强调它,所以我只能认为这不是很大的问题。感谢GeekYouUp的帮助。 - William Stewart
有人对这个话题有更多的信息吗?目前唯一的问题是位图,当运行多个壁纸实例并且它是来自他们SD卡的3MB照片时,它会快速填满16MB的允许空间。 - William Stewart
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接