java - 重启安卓服务

标签 java android wear-os android-wear-data-api watch-face-api

我希望能够重新启动 WatchFaceSerivce,以便我可以再次触发 onCreateEngine() 方法并设置备用壁纸。

但是,我尝试重新启动的 Android 服务正在进行一场真正的战斗,尽管我已经确保它被调用,但代码似乎没有任何效果。

stopService(new Intent(getApplicationContext(), MyWatchfaceService.class));
startService(new Intent(getApplicationContext(), MyWatchfaceService.class));

有没有办法可以在 Android 中强制重新启动服务以触发 onCreateEngine 或在服务首次启动后将引擎设置为备用表盘?

最佳答案

壁纸由 WallpaperManager 管理,其中大多数方法仅适用于系统应用程序。 WallpaperManager 将启动和停止您的服务。

我给你的建议是稍微改变一下你的架构。您只需要一个 WatchFaceService 子类和 Engine 子类,并且无需重新启动其中任何一个。相反,在 Engine 内部,您应该有多个表盘抽屉。所以你的结构是这样的:

WatchFaceService

  Engine

    AnalogWatchFaceDrawer
    DigitalWatchFaceDrawer
    FancyWatchFaceDrawer
    FitnessWatchFaceDrawer
    WeatherWatchFaceDrawer

不,如果您想更改绘制的表盘,您应该只更改当前抽屉并强制立即重画。

编辑: 对于绘图,您要做的就是将 Canvas 和边界传递给当前抽屉并让它完成工作,因此您的代码将如下所示:

    @Override
    public void onDraw(Canvas canvas, Rect bounds) {
        if (mCurrentWatchFaceDrawer != null) {
          mCurrentWatchFaceDrawer.draw(canvas, bounds);
        }
    }

因此,您将所有绘图逻辑推迟到每个抽屉,让它们独立完成工作。

至于加载某些资源,您的抽屉必须有一定的生命周期。因此,他们需要自己的回调,例如 onCreateonDestroy。当您设置一个新抽屉时,您可以调用它的 onCreate ,它会显示图像,当它消失时,您可以调用 onDestroy ,这样它就可以自行清理。所以,你的抽屉现在应该有这样的界面:

public interface WatchFaceDrawer {
  void onCreate();
  void onDestroy();
  void draw(Canvas canvas, Rect bounds);
}

您可能需要添加更多内容来处理其他事件。

关于java - 重启安卓服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27894222/

相关文章:

java - 安卓 watch : 'cannot resolve symbol' error on GregorianCalendar?

java - 单元测试方法调用(模板方法)?

android - 谷歌钱包与 phonegap 集成

android - 无法初始化类 sun.awt.X11.XToolkit

android - addPreferencesFromResource 导致 ClassCastException

java - 在 WEAR OS 上启动 map 需要 WRITE_SETTINGS 权限

java - 使用 DividerItemDecoration 隐藏 recyclerview 中的一些项目分隔线

java - 使我的记录器对我的 Java 应用程序非常有效

java - 如何在非 Activity 类中显示进度对话框

android - 找不到以下类 : - android. support.wearable.view.WatchViewStub