我正在尝试了解如何在启动应用关闭后保持Android服务正常运行。我已经尝试查看样本的后台服务(例如this一个,而一些在Xamarin网站上)但是在每种情况下,如果最小化的应用程序被“刷掉”屏幕,服务将停止运行。我不希望服务意外停止这样,它应该持续运行,直到请求确认停止。该服务不会消耗太多资源,只需获取GPS位置并每2分钟将其发布到一个网站。
作为背景,我是Xamarin / Android的新手,但过去曾用C#在Windows中创建了几个成功的服务
(的后来) 我试过的一个示例确实在运行应用程序的“设置”列表中留下了一个项目,但是一旦刷掉屏幕,实际上并没有执行任何服务任务。此外,状态栏中没有图标。在做了一些阅读后,似乎我的androidmanifest文件缺少'service'属性(尽管我尝试的样本都没有这个);我现在尝试的是这个
<service
android:name=".LocationService"
android:icon="@drawable/icon"
android:label="@string/service_name"
>
<intent-filter>
<action android:name="android.service.LocationService" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>
......但仍然没有运气。
答案 0 :(得分:0)
他们创建了这样的服务:
[Service]
public class SimpleService : Service
{
System.Threading.Timer _timer;
public override StartCommandResult OnStartCommand (Android.Content.Intent intent, StartCommandFlags flags, int startId)
{
Log.Debug ("SimpleService", "SimpleService started");
DoStuff ();
return StartCommandResult.Sticky;
}
public override void OnDestroy ()
{
base.OnDestroy ();
_timer.Dispose ();
Log.Debug ("SimpleService", "SimpleService stopped");
}
public void DoStuff ()
{
_timer = new System.Threading.Timer ((o) => {
Log.Debug ("SimpleService", "hello from simple service");}
, null, 0, 4000);
}
public override Android.OS.IBinder OnBind (Android.Content.Intent intent)
{
throw new NotImplementedException ();
}
}
用这个开始和停止它:
StartService (new Intent (this, typeof(SimpleService)));
StopService (new Intent (this, typeof(SimpleService)));
听起来你也想要一个粘性服务Docs
当系统处于内存压力下时,Android可能会停止任何正在运行的服务。此规则的例外是在前台显式启动的服务,本文稍后将对此进行讨论。
当系统停止服务时,Android将使用OnStartCommand返回的值来确定应该如何或是否应该重新启动服务。此值的类型为StartCommandResult,可以是以下任何一种:
- Sticky - 将重新启动粘性服务,并在重启时将空意图传递给OnStartCommand。在服务持续执行长时间运行操作时使用,例如更新库存源。
- RedeliverIntent - 重新启动服务,并重新传送在系统停止服务之前传递给OnStartCommand的最后一个意图。用于继续长时间运行的命令,例如完成大文件上载。
- NotSticky - 服务不会自动重启。
- StickyCompatibility - 重启将在API级别5或更高级别上表现得像Sticky,但会降级到早期版本的5级前行为。
希望这有帮助。
答案 1 :(得分:0)
现在解决了。令人困惑的主要原因是许多样本已过时(使用已弃用的方法)以及针对“纯”Android项目和Xamarin项目的不同建议。当然不需要修改androidmanifest文件,如上所述。
如果有人试图找到类似的东西,我的项目是here。
当然,解决最初的问题已经提出了一些新的问题,但如果需要,我会单独发布。