应用程序被杀后重新启动Android Started Service

时间:2015-02-09 08:43:32

标签: android xamarin android-service

我正在尝试在android中执行StartedService以定期将用户位置发送到服务器。 直到这一刻,我设法创建服务并从“父”应用程序启动它,我不知道如何在应用程序被杀后保持活着。根据我在互联网上发现的'StartCommandResult.Sticky'应该重启服务,如果这个被杀死但是由于某种原因没有重新开始。

我重写了OnStartCommand:

    public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
    {
        locationTask = new Task(() =>
        {
            //stuff to do
        });
        locationTask.Start();
        return StartCommandResult.Sticky;
    }

服务就像这样开始:

    Intent intent = new Intent(this.Activity, Class.FromType(typeof(LocationService)));
    this.Activity.StartService(intent);

在应用程序被杀之后,我应该怎么做才能让我的服务保持活力?

作为观察我正在使用xamarin来做,但我不介意在android(java)中回答。

4 个答案:

答案 0 :(得分:3)

official documentation中所述:

  

服务已经开始"当一个应用程序组件(如一个   activity)通过调用startService()来启动它。一旦启动,服务   可以在后台无限期地运行,即使组件那个   它被破坏了。通常,启动的服务会执行   单个操作,不会将结果返回给调用者。对于   例如,它可能通过网络下载或上传文件。当。。。的时候   操作完成后,服务应该自行停止。

所以,像这样启动服务

@Override
public int onStartCommand(Intent intent, int flags, int startId) {      
    return Service.START_STICKY;
}

即使您的应用被销毁,您的服务也会正常运行。

关于官方文档中的Service.START_STICKY:

  

如果系统在onStartCommand()返回后终止服务,   重新创建服务并调用onStartCommand(),但不要重新启动   最后的意图。相反,系统使用a调用onStartCommand()   null intent,除非有待启动的意图启动服务,   在这种情况下,这些意图是交付。这适用于媒体   没有执行命令的玩家(或类似服务),但是   无限期地跑步,等待工作。

答案 1 :(得分:1)

像这样覆盖onStartCommand

@Override
public int onStartCommand(Intent intent, int flags, int startId) {      
    return Service.START_STICKY;
}

答案 2 :(得分:1)

对我来说,代码中的所有内容都是正确的,但问题是在检查服务是否打开时使用调试。当我使用发布版本(或只是dev版本而没有连接到调试)时,进程不会被终止并且服务正常运行。

不知道为什么。我正在使用Xamarin Studio 6.0。

答案 3 :(得分:1)

我就是这样做的,但它是用JAVA代码。

在您的服务中,您应该实施LocalBinderonStartCommandonCreate方法。

public class LocalBinder extends Binder {
    ServiceName getService() {
        return ServiceName .this;
    }
}

@Override
public void onCreate() {

}


@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i("LocalService", "Received start id " + startId + ": " + intent);
    return START_STICKY;
}

onStartCommand应为return START_STICKY;。此外,请在您的服务中包含此代码:

@Override
public void onTaskRemoved(Intent rootIntent) {
    // TODO Auto-generated method stub
    Intent restartService = new Intent(getApplicationContext(),this.getClass());
    restartService.setPackage(getPackageName());
    PendingIntent restartServicePI = PendingIntent.getService(getApplicationContext(), 1, restartService, PendingIntent.FLAG_ONE_SHOT);
    AlarmManager alarmService = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
    alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() +1000, restartServicePI);
}

这将在您关闭服务后的1秒钟内重新启动服务。此外,不要忘记在AndroidManifest.xml

中添加您的服务
<service android:name=".ServiceName"
             android:exported="false"
             android:stopWithTask="false" >
</service>