2017-03-04 124 views
1

我想在活動中找到我自己的服務(RadarService) - 檢查服務是否正在運行。如何找到我自己的服務?

但是,命名是,errm,有點混亂,我迷路了。爲了啓動一個服務,我創建的意圖:

this.radarIntent = new Intent(this, typeof(RadarService)); 

於是,我就從這個意圖提取服務的名稱,並用它來比較 - 但Class屬性返回類的意圖本身的名字,Type屬性爲空。

好吧,所以我試圖用typeof(RadarService).ToString() - 這給我的字符串MyNamespace.RadarService,很好。但是,當我試圖將其與我失敗的正在運行的服務列表相匹配時,因爲我的服務列爲md5--here-comes-md5-hash--.RadarService(它設置爲ClassNameShortClassName,在ActivityManager.RunningServiceInfo中)。

那麼如何找到我自己的服務呢?

回答

3

typeof將會給C#類型/名稱,你想自動生成JavaAndroid的可調用包裝類,C#類型的,所以你可以得到它的CanonicalName

Java.Lang.Class.FromType(typeof(StackOverFlowService)).CanonicalName) 

例子:

var intent = new Intent(this, typeof(StackOverFlowService)); 
StartService(intent); 

var serviceName = Java.Lang.Class.FromType(typeof(StackOverFlowService)).CanonicalName; 
var manager = (ActivityManager)GetSystemService(ActivityService); 
foreach (var item in manager.GetRunningServices(int.MaxValue)) 
{ 
    if (item.Service.ClassName == serviceName) 
     Log.Debug("SO", "Service is running!!!"); 
} 

可以避開基於MD5汽車Java類的命名是Xamarin.Android確實經由在基於ACW-class屬性的Name參數硬編碼的名稱:

[Service(Label = "StackOverFlowService", Name="com.sushihangover.WickedApp.StackOverFlowService")] 
[IntentFilter(new String[] { "com.sushihangover.StackOverFlowService" })] 
public class StackOverFlowService : Service 
{ 
~~~ 
} 

現在您的服務Java類名稱將是com.sushihangover.WickedApp.StackOverFlowService而不是md58b0fd40f68fa0d8c16b76771789ed62a.StackOverFlowService

+0

非常感謝!還有關於服務屬性的信息。 – greenoldman

相關問題