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

2024-01-10

我正在创建动态壁纸,并使用本教程作为起点:

http://code.tutsplus.com/tutorials/create-a-live-wallpaper-on-android-using-an-animated-gif--cms-23088 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);
            }
        }
    }

我可能迟到了,但希望有人会发现这很有用。

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

SharedPreferences preferences = getSharedPreferences("PREFERENCES NAME", Context.MODE_PRIVATE);
        preferences.registerOnSharedPreferenceChangeListener(this);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设置更新后如何重新启动此壁纸引擎? 的相关文章

  • 调试VS 2005提示“操作不支持”

    我一直在调试 VS 2005 并将 启动外部程序 设置为 C Program Files Microsoft Visual Studio 10 0 Common7 IDE devenv exe 但按 F5 后出现此错误 尝试运行项目时出错
  • 如何让JComboBox中的内容居中显示?

    目前我有这个JComboBox 我怎样才能将其中的内容居中 String strs new String 15158133110 15158133124 15158133458 JComboBox com new JComboBox str
  • 使用ssl和socket的python客户端身份验证

    我有一个 python 服务器 需要客户端使用证书进行身份验证 我如何制作一个客户端脚本 使用客户端证书由 python 中的服务器使用 ssl 和套接字模块进行身份验证 有没有仅使用套接字和 ssl 而不扭曲的示例 from OpenSS
  • Android Jasper 报告

    Jasper Reporting 可以集成到 Android 应用程序中吗 我正在尝试从 jrxml 文件生成 PDF CSV 文本和 XLS 报告 但是 我没有看到 Android SDK 支持 net sf jasperreports
  • 查找总和为给定数字的值组合的函数

    这个帖子查找提供的 Sum 值的组合 https stackoverflow com a 20194023 1561176呈现函数subsets with sum 它在数组中查找总和等于给定值的值的组合 但由于这个帖子已经有6年多了 我发这
  • 如何为不同操作系统/Python 版本编译 Python C/C++ 扩展?

    我注意到一些成熟的Python库已经为大多数架构 Win32 Win amd64 MacOS 和Python版本提供了预编译版本 针对不同环境交叉编译扩展的标准方法是什么 葡萄酒 虚拟机 众包 我们使用虚拟机和Hudson http hud
  • 在 VS2008 的 XAML 编辑器中禁用 Intellisense?

    有没有办法在 Visual Studio 2008 的 XAML 编辑器中禁用 Intellisense 打字时通常会消耗很大的性能 有时我会等待十秒或更长时间 直到列表自动弹出 似乎在 选项 gt 文本编辑器 gt XAML 中 Inte
  • Swing:创建可拖动组件...?

    我在网上搜索了可拖动 Swing 组件的示例 但我发现示例不完整或不起作用 我需要的是一个摇摆组件那可以是dragged通过鼠标 在另一个组件内 被拖拽的时候 应该已经 改变它的位置 而不仅仅是 跳 到目的地 我很欣赏无需非标准 API 即
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost
  • ggplot2 的 fortify 函数出错

    我在 ggplot2 中使用 fortify 方法时收到此错误 Error in function classes fdef mtable unable to find an inherited method for function pr
  • 在门户中查看 Azure WebJob 计划?

    我创建了一个简单的 Azure WebJob 并通过 Visual Studio 集成制定了每天运行一次的计划 我已经部署了 WebJob 并看到它列在我在 Azure 上的应用程序中 schema http schemastore org
  • Apache Beam Pipeline 写表后查询表

    我有一个 Apache Beam Dataflow 管道 它将结果写入 BigQuery 表 然后我想查询该表以获取管道的单独部分 但是 我似乎无法弄清楚如何正确设置此管道依赖性 我编写的新表 然后想要查询 与一个单独的表连接以进行某些过滤
  • 嵌入式二进制资源 - 如何枚举嵌入的图像文件?

    我按照中的说明进行操作这本书 http www apress com book view 9781430225492 关于资源等的章节 我不太明白的是 如何替换它 images Add new BitmapImage new Uri Ima
  • 以 Rails 形式处理 MongoMapper EmbeddedDocument

    首先 我对一般编程和 Rails 都是新手 我选择 Rails 是因为它看起来是一种很容易上手的语言 对于我的项目 我将 MongoMapper 与 Rails 结合使用 我正在尝试以与文档相同的形式处理嵌入文档 我有以下模型 class
  • 在 for 循环比较中使用集合大小

    Java 中 Collections 的 size 方法是否有编译器优化 考虑以下代码 for int i 0 i
  • 给定文档,选择相关片段

    当我在这里提出问题时 自动搜索返回的问题的工具提示给出了问题的前一点 但其中相当一部分没有给出任何比理解问题更有用的文本 标题 有谁知道如何制作一个过滤器来删除问题中无用的部分 我的第一个想法是修剪仅包含某个列表中的单词的任何前导句子 例如
  • CLion - 命令行程序参数

    当我分配给 运行 调试配置 程序参数 之类的 aaa bbb 然后打印它时 任何人都可以告诉我 JetBrains CLion 有什么问题吗 printf s n argv 1 我刚刚得到 aaa 而它必须是 aaa bbb 因为它们用双引
  • 从 npm 脚本运行时,eslint 不会报告任何错误

    我已经使用 npm init eslint config 安装了带有 typescript 的 eslint 然后将 lint 脚本添加到我的 package json 中 但是当我运行 npm script lint npm run li
  • 无法将 /root/.rnd 加载到 RNG 中

    我想使用 Windows Open SSL 生成服务器证书 当我运行此命令行时 出现此错误 我应该怎么办 Command openssl req new x509 days 3650 key ca key out ca crt Error
  • Android Espresso - 如果未选中,请单击复选框

    I have onView withId R id check box perform click 但我只想在尚未选中该复选框时执行此操作 我怎样才能在浓缩咖啡中做到这一点 我还想根据其之前的状态来切换复选框 开关 起初 我尝试用此方法打开

随机推荐