2011-05-25 102 views
1

嘿傢伙,我創建了一個動態壁紙,它將用戶選擇的文件作爲背景圖像。Android動態壁紙服務不被破壞

我遇到的問題是,當我點擊'設置壁紙'它開始我的壁紙服務,然後如果我回到我的活動壁紙,再次單擊'設置壁紙',它似乎並沒有關閉以前的服務,但也運行另一個。這意味着每次點擊「設置壁紙」時,用戶SD卡中的圖像被讀入Bitmap變量,並增加每次使用的內存,最終引發OutOfMemoryError。

我的onDestroy()方法取消了所有位圖引用並且沒有System.gc(),但是在這種情況下,似乎服務在設置相同的壁紙時並未被破壞。例如,如果我有我的壁紙設置,然後選擇設置'銀河'動態壁紙,這會破壞我的壁紙服務,但是當再次設置我的壁紙時,它不會破壞原來的服務。

有沒有人遇到過這個?有沒有不同的方法,我應該廢除和垃圾收集?任何幫助將非常感激。

謝謝,

威廉。

回答

1

我很確定我已經找到了解決這個問題的其他人。

看來,當我已經有我的壁紙運行,然後我點擊'設置壁紙'的預覽,onDestroy()方法不會被調用。但是,取消位圖並調用stopSelf()可以放在onSurfaceDestroyed方法中,這似乎適用於每個打開的WallpaperService引擎實例。這可能不是正確的做事方式,但目前看起來確實可行。

感謝GeekYouUp幫助stopSelf()。

+0

你可以完全寫出一個方法嗎? – GAAAN 2018-01-06 01:48:55

0

服務調用stopSelf()一旦完成了嗎?

+0

不,它應該在onDestroy()方法嗎? – 2011-05-25 16:28:39

+0

我試圖在onDestroy()方法中調用stopSelf(),但未更改。爲了測試它,我將手機設置爲在onDestroy()方法內部振動,該方法在退出可以更改設置的壁紙預覽部分時起作用,等等。但是,當將我的壁紙設置爲相同時,似乎沒有這樣做牆紙。它就像它不調用onDestroy,除非我設置一個新的壁紙。 – 2011-05-25 16:43:58

+0

不,應該在服務完成後開始調用它。請閱讀http://developer.android.com/reference/android/app/Service.html#ServiceLifecycle – GeekYouUp 2011-05-25 17:09:41

1

再次設置壁紙之前。摧毀之前的壁紙。 這對我有用。並在您從中調用WallpaperService的活動中銷燬壁紙。在WallpaperService中銷燬默認爲設備的Wallpaper。

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

希望這會有所幫助。