壁纸由 管理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);
}
}
因此,您将所有绘图逻辑推迟到每个抽屉,让他们独立完成工作。
至于加载一些资源,你的抽屉必须有一些生命周期。所以,他们需要自己的回调,比如onCreate
and onDestroy
。当你设置一个新的抽屉时,你调用它onCreate
,它将图像和当它消失时,你调用onDestroy
,所以它可以自己清理。所以,你的抽屉现在应该有这样的界面:
public interface WatchFaceDrawer {
void onCreate();
void onDestroy();
void draw(Canvas canvas, Rect bounds);
}
您可能需要添加更多来处理其他事件。