我想在 Activity 中找到我自己的服务 ( RadarService
) -- 检查服务是否正在运行。
但是命名有点困惑,我迷路了。为了启动服务,我创建了 Intent :
this.radarIntent = new Intent(this, typeof(RadarService));
所以我试图从这个 Intent 中提取服务的名称并将其用于比较——但是Class
属性返回 Intent 本身的类的名称,Type
属性为空。
好的,所以我尝试使用 typeof(RadarService).ToString()
-- 这给我字符串 MyNamespace.RadarService
, 好的。但是当我试图将它与正在运行的服务列表进行匹配时,我失败了,因为我的服务被列为 md5--here-comes-md5-hash--.RadarService
(在ClassName
中设置为ShortClassName
和ActivityManager.RunningServiceInfo
)。
那么如何找到自己的服务呢?
最佳答案
typeof
将提供 C#
类型/名称,您需要自动生成的 Java
Android Callable Wrapper 该 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!!!");
}
您可以通过基于 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
关于android - 如何找到我自己的服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42600863/