0

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

然而,我试图重新启动的 Android 服务正在打一场真正的斗争,尽管我确保它被调用,但似乎代码似乎没有任何效果。

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

有没有办法在服务第一次启动后强制重启我的 Android 服务以触发 onCreateEngine 或将引擎设置为备用表盘?

4

1 回答 1

2

壁纸由 管理WallpaperManager,它主要具有仅适用于系统应用程序的方法。它将WallpaperManager启动和停止您的服务。

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

WatchFaceService

  Engine

    AnalogWatchFaceDrawer
    DigitalWatchFaceDrawer
    FancyWatchFaceDrawer
    FitnessWatchFaceDrawer
    WeatherWatchFaceDrawer

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

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

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

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

至于加载一些资源,你的抽屉必须有一些生命周期。所以,他们需要自己的回调,比如onCreateand onDestroy。当你设置一个新的抽屉时,你调用它onCreate,它将图像和当它消失时,你调用onDestroy,所以它可以自己清理。所以,你的抽屉现在应该有这样的界面:

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

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

于 2015-01-12T18:24:01.040 回答