Android 更新设置后,如何重新启动此壁纸引擎?

Android 更新设置后,如何重新启动此壁纸引擎?,android,live-wallpaper,wallpaper,android-wallpaper,android-sharedpreferences,Android,Live Wallpaper,Wallpaper,Android Wallpaper,Android Sharedpreferences,我正在创建一张实时壁纸,并将本教程作为起点: 我正在尝试添加一个设置菜单,让用户从四种背景中选择一种。我使用SharedReferences使一切都正常工作。唯一的问题是,在“设置”菜单中更改设置后,壁纸不会更新。如果重新启动应用程序,背景将使用上次选择的背景进行更新,但它仅在重新启动壁纸后工作(即,选择其他壁纸,然后重新选择此壁纸) 我已经将问题缩小到这样一个事实,即SharedReference中的值仅在onCreateEngine()方法中更新。墙纸服务运行后,不会调用onCreateE

我正在创建一张实时壁纸,并将本教程作为起点:

我正在尝试添加一个设置菜单,让用户从四种背景中选择一种。我使用
SharedReferences
使一切都正常工作。唯一的问题是,在“设置”菜单中更改设置后,壁纸不会更新。如果重新启动应用程序,背景将使用上次选择的背景进行更新,但它仅在重新启动壁纸后工作(即,选择其他壁纸,然后重新选择此壁纸)

我已经将问题缩小到这样一个事实,即
SharedReference
中的值仅在
onCreateEngine()
方法中更新。墙纸服务运行后,不会调用
onCreateEngine()
方法,因此即使
SharedReference
的值已更改,也不会在墙纸服务中进行更新

我的问题是如何重新启动墙纸,以便在更改设置后调用
onCreateEngine()
方法?同样,
SharedReferences
也在工作,因为重启后一切都正常。我知道我需要使用
onsharedPreferenceChanged
方法,但我不确定应该在哪里使用,或者该方法中应该包含哪些代码来重新启动墙纸引擎

下面是示例代码。除评论中指出的情况外,我的意见相同:

    import android.graphics.Canvas;
    import android.graphics.Movie;
    import android.os.Handler;
    import android.service.wallpaper.WallpaperService;
    import android.util.Log;
    import android.view.SurfaceHolder;

    import java.io.IOException;

    public class GIFWallpaperService extends WallpaperService implements onsharedpreferencechangelistener {

        // Variable I added to change background
        String mBackgroundImage = null;

        // Method I added to update background image
        public void updatedBackgroundImage(){
             // code that sets mBackgroundImage based upon value of shared preference file. 
        }

        @Override
        public WallpaperService.Engine onCreateEngine() {

            // I call this method to change the value of mBackgroundImage
            updateBackgroundImage(); 

            try {
                Movie movie = Movie.decodeStream(
                        getResources().getAssets().open("mBackgroundImage"));

                return new GIFWallpaperEngine(movie);
            }catch(IOException e){
                Log.d("GIF", "Could not load asset");
                return null;
            }
        }

        @Override
        public void onSharedPreferenceChanged(SharedPreferences sp, String key) {
    // What do I do?  How do I make the wallpaper engine restart when settings are changed?  
        }

        private class GIFWallpaperEngine extends WallpaperService.Engine {

            private final int frameDuration = 20;

            private SurfaceHolder holder;
            private Movie movie;
            private boolean visible;
            private Handler handler;

            public GIFWallpaperEngine(Movie movie) {
                this.movie = movie;
                handler = new Handler();
            }

            @Override
            public void onCreate(SurfaceHolder surfaceHolder) {
                super.onCreate(surfaceHolder);
                this.holder = surfaceHolder;
            }

            private Runnable drawGIF = new Runnable() {
                public void run() {
                    draw();
                }
            };


            private void draw() {
                if (visible) {
                    Canvas canvas = holder.lockCanvas();
                    canvas.save();
                        // Adjust size and position so that
                        // the image looks good on your screen
                        canvas.scale(3f, 3f);
                        movie.draw(canvas, -100, 0);
                    canvas.restore();
                    holder.unlockCanvasAndPost(canvas);
                    movie.setTime((int) (System.currentTimeMillis() % movie.duration()));

                    handler.removeCallbacks(drawGIF);
                    handler.postDelayed(drawGIF, frameDuration);
                }
            }

            @Override
            public void onVisibilityChanged(boolean visible) {
                this.visible = visible;
                if (visible) {
                    handler.post(drawGIF);
                } else {
                    handler.removeCallbacks(drawGIF);
                }
            }

            @Override
            public void onDestroy() {
                super.onDestroy();
                handler.removeCallbacks(drawGIF);
            }
        }
    }

我不知道你是否找到了答案,但我在android参考中看到了这一点:

壁纸服务。引擎onCreateEngine()

必须实现才能返回墙纸引擎的新实例。请注意,多个实例可能同时处于活动状态,例如当墙纸当前设置为活动墙纸且用户在墙纸选择器中查看其预览时


克里斯

我可能迟到了,但希望有人会觉得这很有用

您需要首先指定并注册SharedPref。将其添加到onCreate()方法中


有人能帮我解决这个问题吗?在继续处理这个问题之后,我认为问题在于当发生更改时,
onSharedPreferenceChange()
没有被调用。我正在试图找出原因。好的,我修复了没有调用
onSharedPreferenceChange()
的问题。现在正在从
壁纸服务
中调用它,但我不知道在实现中应该放什么。当
服务第一次启动时,一切正常。。。设置背景图像的变量将根据用户在菜单中选择的内容进行更新,但由于
服务
已在运行,因此更新后的变量无效。请帮忙!!!你解决这个问题了吗?
SharedPreferences preferences = getSharedPreferences("PREFERENCES NAME", Context.MODE_PRIVATE);
        preferences.registerOnSharedPreferenceChangeListener(this);