Android 如何找到我自己的服务?

Android 如何找到我自己的服务?,android,xamarin,xamarin.android,android-service,Android,Xamarin,Xamarin.android,Android Service,我想在活动中找到我自己的服务(RadarService),以检查该服务是否正在运行 然而,这个名字有点混乱,我迷路了。为了启动服务,我创建了以下意图: this.radarIntent = new Intent(this, typeof(RadarService)); 因此,我试图从这个意图中提取服务的名称并将其用于比较——但是Class属性返回意图本身的类的名称,Type属性为空 好的,所以我尝试使用typeof(RadarService).ToString()——这给了我字符串MyNam

我想在活动中找到我自己的服务(
RadarService
),以检查该服务是否正在运行

然而,这个名字有点混乱,我迷路了。为了启动服务,我创建了以下意图:

 this.radarIntent = new Intent(this, typeof(RadarService));
因此,我试图从这个意图中提取服务的名称并将其用于比较——但是
Class
属性返回意图本身的类的名称,
Type
属性为空

好的,所以我尝试使用
typeof(RadarService).ToString()
——这给了我字符串
MyNamespace.RadarService
,很好。但是,当我试图将其与正在运行的服务列表进行匹配时,我失败了,因为我的服务被列为
md5--here-comes-md5-hash--.RadarService
(在
活动管理器.RunningServiceInfo
中设置为
ClassName
ShortClassName


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

typeof
将给出
C
类型/名称,您需要自动生成该C类型的
Java
Android可调用包装类,这样您就可以得到它的
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!!!");
}
通过使用基于ACW的类属性上的
name
参数对名称进行硬编码,可以避免
Xamarin.Android
自动基于MD5的Java类命名:

[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

非常感谢!还可以查看有关服务属性的信息。