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
非常感谢!还可以查看有关服务属性的信息。