3

Я создаю живые обои, и я использую этот учебник в качестве отправной точки:Как перезагрузить этот обозреватель после обновления настроек?

http://code.tutsplus.com/tutorials/create-a-live-wallpaper-on-android-using-an-animated-gif--cms-23088

Я пытаюсь добавить меню настроек, чтобы позволить пользователю выбрать один из четырех фонов. У меня все работает, используя SharedPreferences. Единственная проблема заключается в том, что обои не обновляются после изменения настроек в меню настроек. Если вы перезапустите приложение, фон будет обновлен с выбранным последним фоном, но он работает только после перезапуска обоев (т. Е. Выбора разных обоев, а затем повторного выбора этих обоев).

Я сузил проблему до того, что значение от SharedPreference обновляется только в методе onCreateEngine(). Как только служба обоев запущена, метод onCreateEngine() не вызывается, поэтому, хотя значение SharedPreference было изменено, оно не обновляется в службе обоев.

Мой вопрос: как перезапустить обои так, чтобы метод onCreateEngine() вызывался после изменения настройки? Опять же, SharedPreferences работают, так как все работает после перезагрузки. Я знаю, что мне нужно использовать метод 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); 
      } 
     } 
    } 
+0

Может ли кто-нибудь мне помочь? –

+0

После того, как я продолжаю связываться с этим, я думаю, проблема заключается в том, что 'onSharedPreferenceChange()' не вызывается, когда происходит изменение. Я пытаюсь понять, почему. –

+0

Хорошо, я исправил проблему с 'onSharedPreferenceChange()' не вызываемой. Теперь он вызывается изнутри «WallpaperService», но я не могу понять, что включить в реализацию. Все работает нормально, когда начинается «Сервис» ... и переменная, которая устанавливает фоновое изображение, обновляется в зависимости от того, что пользователь выбирает в меню, но поскольку «Сервис» уже запущен, обновленная переменная не имеет эффекта , ПОЖАЛУЙСТА ПОМОГИ!!! –

ответ

-1

Я не знаю, если вы нашли ответ на свой вопрос, но я видел это в андроида исх:

WallpaperService.Engine onCreateEngine()

Должен быть реализован для возврата нового экземпляра движка обоев. Обратите внимание, что несколько экземпляров могут быть активны одновременно, например, когда обои в настоящее время установлены как активные обои, а пользователь также находится в обойме обоев, просматривая его.

Крис

1

Я Propably поздно, но надеюсь, что кто-то найдет это полезным.

Прежде всего, необходимо указать и зарегистрировать вас в SharedPrefs. Добавьте это в свой метод onCreate().

SharedPreferences preferences = getSharedPreferences("PREFERENCES NAME", Context.MODE_PRIVATE); 
     preferences.registerOnSharedPreferenceChangeListener(this);