3

我正在通过扩展 WallpaperService 和 Engine 类来创建动态壁纸。壁纸不会经常更改,因此为了避免不必要的 CPU 使用,我只在某些事件(触摸、visibilityChanged 等)上绘制壁纸。我还使用 PreferenceFragment 为墙纸生成设置活动。

问题:当用户在设置活动中更改首选项时,我希望壁纸能够收到通知并使用新设置尽快重绘自己。但是由于我只阅读设置并在某些事件上绘制壁纸,因此在触发这些事件之前不会发生壁纸的变化。

将不胜感激解决方案:) thnx。

有人吗?:(

4

3 回答 3

5

你有两个选择。要么检查首选项值onVisibilityChanged()并相应地更新壁纸。或者使用 anOnSharedPreferenceChangeListener让您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();
    }
}
于 2013-11-22T03:01:22.330 回答
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

于 2013-11-22T02:24:34.217 回答
0

我一直在寻找同样的东西,我发现了自己的解决方案;您可以在您的设置活动中使用实时数据,然后在您的服务中观察它。这使它变得容易得多。

于 2020-06-05T05:31:49.930 回答