Я создаю живые обои, и я использую этот учебник в качестве отправной точки:Как перезагрузить этот обозреватель после обновления настроек?
Я пытаюсь добавить меню настроек, чтобы позволить пользователю выбрать один из четырех фонов. У меня все работает, используя 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);
}
}
}
Может ли кто-нибудь мне помочь? –
После того, как я продолжаю связываться с этим, я думаю, проблема заключается в том, что 'onSharedPreferenceChange()' не вызывается, когда происходит изменение. Я пытаюсь понять, почему. –
Хорошо, я исправил проблему с 'onSharedPreferenceChange()' не вызываемой. Теперь он вызывается изнутри «WallpaperService», но я не могу понять, что включить в реализацию. Все работает нормально, когда начинается «Сервис» ... и переменная, которая устанавливает фоновое изображение, обновляется в зависимости от того, что пользователь выбирает в меню, но поскольку «Сервис» уже запущен, обновленная переменная не имеет эффекта , ПОЖАЛУЙСТА ПОМОГИ!!! –