簡體   English   中英

Android檢查服務是否正在從其他應用程序運行

[英]Android check if service is running from another application

我正在編寫兩個相互配合的應用程序,一個收集數據(使用服務),另一個是自定義鍵盤,該鍵盤從服務中獲取數據並將其寫入所選的任何文本字段。 所有這些都工作正常,我唯一的問題是服務綁定。 現在,當他們調用bind時,該服務將從任何應用程序啟動。 那不是我想要的行為; 數據收集應用程序應該是唯一通過活動啟動/停止服務的應用程序,只有在服務正在運行時,鍵盤才會綁定。 我需要做的是在調用綁定之前檢查服務是否正在運行。 無論如何,我可以通過鍵盤應用程序檢查狀態嗎? 是否有某種鎖來表示服務的存在? 我現在發現的所有方法都需要從服務啟動位置開始的類名和上下文,而這些方法對我不起作用。

基本上以三種可能性結束,希望這對以后的人有所幫助。

方法1 :(盡管方法2更好,但我對事件進行了處理)

    public static boolean isServiceRunning(Context queryingContext) {
    try {
        ActivityManager manager = (ActivityManager) queryingContext.getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if ("com.example.myservice".equals(service.service.getClassName()))
                return true;
        }
    } catch (Exception ex) {
        Toast.makeText(queryingContext, "Error checking service status", Toast.LENGTH_SHORT).show();
    }
    return false;
}

方法2:

就像上面建議的bindService一樣,將bindService與標志0一起使用。唯一的問題是,無論方法是否連接,該方法將始終返回true,您將不得不尋找另一種方式來了解發生了什么(如果發生錯誤,您將不會收到服務句柄它失敗了)

方法3:

yosriz建議,使用SharedPreference停止其他應用程序將檢查並知道服務狀態的狀態標志。

無法檢查服務以查看其是否已經啟動,Android服務旨在處理多個客戶端,並且如果bind方法尚未運行,則bind方法將創建該服務。

因此,您可以顯式啟動它,也可以使用bind()建立綁定服務連接,如果不存在,它將創建新的綁定。

但是,您可以通過多種方式實現此功能,例如,以某種共享的首選項保存服務“正在運行”狀態,並在綁定到服務之前檢查此首選項。 (SharedPreference可以在具有相同用戶標識的2個進程之間共享)

暫無
暫無

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

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