重新启动Android服务

时间:2015-01-12 01:41:26

标签: 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第一次启动后强制重新启动Android服务以触发onCreateEngine或将Engine设置为备用表盘?

1 个答案:

答案 0 :(得分: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);
        }
    }

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

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

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

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