我正在通过扩展WallpaperService和Engine类来创建动态壁纸。壁纸不会经常更改,所以为了避免不必要的CPU使用,我只在某些事件上绘制壁纸(触摸,visibilityChanged等)。我也使用PreferenceFragment为壁纸生成设置活动。
问题:当用户更改设置活动中的首选项时,我喜欢壁纸以获得通知并使用新设置尽快重绘自己。但由于我只阅读设置并在某些事件上绘制壁纸,因此在触发这些事件之前,壁纸的更改不会发生。
会很感激解决方案:) thnx。
任何人? :(
答案 0 :(得分:4)
你有两个选择。检查onVisibilityChanged()
中的偏好值并相应地更新壁纸。或者使用OnSharedPreferenceChangeListener
让您的Engine
知道用户何时更改了偏好设置。
后者的例子。
让您的Engine
实施OnSharedPreferenceChangeListener
界面。
private class MyEngine extends Engine implements OnSharedPreferenceChangeListener {
// A reference to our shared prefs;
private SharedPreferences mPreferences;
@Override
public void onCreate(SurfaceHolder surfaceHolder) {
super.onCreate(surfaceHolder);
mPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
// Register an OnSharedPreferenceChangeListener to our shared prefs
mPreferences.registerOnSharedPreferenceChangeListener(this);
// Your existing code ...
}
@Override
public void onDestroy() {
super.onDestroy();
// Don't forget to unregister the listener
mPreferences.unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
// Whenever the user changes a setting, this method will be called.
// So do what needs to be done here, like redrawing the wallpaper
redrawWallpaper();
}
}
答案 1 :(得分:0)
最好的方法是每帧画一次你的壁纸,但是当可见度改变时,暂停并恢复壁纸上的渲染(WallpaperService.Engine.onVisibilityChanged(boolean))
您可以通过调用GLSurfaceView.onResume()和onPause()来实现。
http://developer.android.com/reference/android/service/wallpaper/WallpaperService.Engine.html#onVisibilityChanged(boolean)
http://developer.android.com/reference/android/opengl/GLSurfaceView.html
答案 2 :(得分:0)
我一直在寻找相同的东西,但发现了自己的解决方案。您可以在设置活动中使用实时数据,然后在服务中对其进行观察。这使它变得容易得多。