我正在尝试在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)中回答。
答案 0 :(得分:3)
服务已经开始"当一个应用程序组件(如一个 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代码。
在您的服务中,您应该实施LocalBinder
,onStartCommand
和onCreate
方法。
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>