3

我创建了一个动态壁纸,它将用户选择的文件作为背景图像。

我遇到的问题是,当我单击“设置壁纸”时,它会启动我的壁纸服务,然后如果我回到我的动态壁纸并再次单击“设置壁纸”,它似乎并没有关闭以前的服务,但是也只是运行另一个。这意味着每次单击“设置墙纸”时,用户 SD 卡中的图像都会被读入位图变量并增加每次使用的内存,最终会引发 OutOfMemoryError。

我的 onDestroy() 方法使所有位图引用无效并执行 System.gc(),但是在这种情况下,在其上设置相同的墙纸时似乎服务没有被破坏。

例如,如果我设置了我的壁纸,然后选择设置“银河”动态壁纸,这会破坏我的壁纸服务,但再次设置我的壁纸时,它不会破坏原来的服务。

有没有人遇到过这个?有没有我应该取消和垃圾收集的不同方法?任何帮助将非常感激。

4

3 回答 3

4

在再次设置壁纸之前。销毁以前的墙纸。这对我有用。并在您调用 WallpaperService 的 Activity 中销毁壁纸。在 WallpaperService 内部销毁会导致设备的默认壁纸。

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

希望这可以帮助。

于 2016-06-19T07:52:45.003 回答
1

我很确定我已经为其他遇到此问题的人解决了这个问题。

似乎当我已经运行我的壁纸时,然后我在其预览中单击“设置壁纸”,onDestroy() 方法没有被调用。但是,可以将取消位图和调用 stopSelf() 放入 onSurfaceDestroyed 方法中,这似乎适用于每个打开的 WallpaperService Engine 实例。这可能不是正确的做事方式,但目前似乎可以正常工作。

感谢 GeekYouUp 对 stopSelf() 的帮助。

于 2011-05-28T23:02:49.137 回答
0

服务完成后是否调用 stopSelf()?

于 2011-05-25T16:19:50.563 回答