如何找到我自己的服务?

How to find my own service?

我想在 activity 中找到我自己的服务 (RadarService) -- 检查该服务是否 运行。

但是命名有点混乱,我迷路了。为了启动服务,我创建了意图:

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

所以我试图从这个意图中提取服务的名称并将其用于比较——但是 Class 属性 returns class 的名称意图本身,Type 属性 是空的。

好的,所以我尝试使用 typeof(RadarService).ToString()——这给了我字符串 MyNamespace.RadarService,很好。但是,当我尝试将它与 运行 服务列表匹配时,我失败了,因为我的服务被列为 md5--here-comes-md5-hash--.RadarService(它在 [= 中设置为 ClassNameShortClassName 19=]).

那么如何找到我自己的服务呢?

typeof 将给 C# 类型/名称,你想要自动生成的 Java Android Callable Wrapper class 该 C# 类型,因此您可以获得它的 CanonicalName.

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

示例:

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

var serviceName = Java.Lang.Class.FromType(typeof(WhosebugService)).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!!!");
}

您可以避免 Xamarin.Android 基于自动 MD5 的 Java class 命名,方法是通过基于 ACW [=] 的 Name 参数对名称进行硬编码34=] 属性:

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

现在您的服务 Java class 名称将是 com.sushihangover.WickedApp.WhosebugService 而不是 md58b0fd40f68fa0d8c16b76771789ed62a.WhosebugService