背景服务混淆

时间:2016-05-03 16:39:20

标签: xamarin xamarin.android

我正在尝试了解如何在启动应用关闭后保持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>

......但仍然没有运气。

2 个答案:

答案 0 :(得分:0)

你有没看过Xamarin样本here来源是here

他们创建了这样的服务:

[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

当然,解决最初的问题已经提出了一些新的问题,但如果需要,我会单独发布。