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