嘿伙计们,我创建了一个动态壁纸,它将用户选择的文件作为背景图像。
我遇到的问题是,当我点击“设置壁纸”时,它开始我的壁纸服务,然后如果我回到我的动态壁纸并再次点击“设置壁纸”,它似乎没有关闭以前服务,但也运行另一个。这意味着每次单击“设置墙纸”时,用户SD卡中的图像将被读入Bitmap变量并增加每次使用的内存,最终会抛出OutOfMemoryError。
我的onDestroy()方法使所有Bitmap引用无效并且执行System.gc(),但是在这种情况下,当在它上面设置相同的壁纸时,服务似乎没有被销毁。
例如,如果我设置了我的壁纸,然后选择设置'Galaxy'动态壁纸,这会破坏我的壁纸服务,但是当再次设置我的壁纸时,它不会破坏原始服务。
有没有人遇到过这个?是否有一种不同的方法我应该取消和垃圾收集?任何帮助将不胜感激。
谢谢,
威廉。
答案 0 :(得分:3)
再次设置壁纸之前。摧毁以前的壁纸。 这对我有用。并在您调用WallpaperService的Activity中销毁壁纸。在WallpaperService中销毁导致默认的设备壁纸。
WallpaperManager wallpaperManager = WallpaperManager.getInstance(getApplicationContext());
try {
wallpaperManager.clear();
} catch (IOException e) {
e.printStackTrace();
}
希望这有帮助。
答案 1 :(得分:1)
我很确定我已经找到了其他有这个问题的人。
似乎当我已经运行了我的壁纸时,我在其预览中单击“设置壁纸”,未调用onDestroy()方法。但是,使bitmaps无效并调用stopSelf()可以放在onSurfaceDestroyed方法中,这似乎适用于每个WallpaperService Engine打开的实例。它可能不是正确的做事方式,但目前似乎工作正常。
感谢GeekYouUp对stopSelf()的帮助。
答案 2 :(得分:0)
服务一旦完成就调用stopSelf()吗?