簡體   English   中英

重新啟動Android服務

[英]Restarting Android service

我希望能夠重新啟動WatchFaceSerivce,以便可以再次觸發onCreateEngine()方法並設置備用牆紙。

但是,我嘗試重新啟動的Android服務正在引起一場激烈的戰斗,盡管我已確保調用了該代碼,但似乎該代碼似乎無效。

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

有沒有一種方法可以在第一次啟動服務后強制重啟Android服務以觸發onCreateEngine或將Engine設置為備用表盤?

牆紙由WallpaperManager管理,該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);
}

您可能需要添加更多內容來處理其他事件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM