2015-04-03 517 views
1

即使在用户关闭应用程序(来自任务管理器或相关任务)后,我也希望确保我的服务在后台运行。我试图执行START_STICKY,但不知道如何正确覆盖startService方法以允许此工作。如何在服务中设置START_STICKY

目前我只是用startService方法来启动并绑定LoggingIn.classMessagingService.class为:

startService(new Intent(LoggingIn.this, MessagingService.class));

我已经研究了该方法onStartCommand是实施START_STICKY常见的位置,但我在我的应用程序中没有找到它的需要,因为一旦服务已经开始,我将所有其他类绑定到它:

private ServiceConnection mConnection = new ServiceConnection() { 

    public void onServiceConnected(ComponentName className, IBinder service) { 
     imService = ((MessagingService.IMBinder) service).getService(); 
    } 

    public void onServiceDisconnected(ComponentName className) { 
     imService = null; 
     Toast.makeText(GroupMessaging.this, R.string.local_service_stopped, 
       Toast.LENGTH_SHORT).show(); 
    } 
}; 

bindService(new Intent(GroupMessaging.this, MessagingService.class), 
      mConnection, Context.BIND_AUTO_CREATE); 

我怎样才能正确地实现START_STICKY,并确保我的服务保持活动状态或应用程序关闭后,即使重新启动?

+0

如果您使用startService()并且不重写onStartCommand(),则默认实现已经返回START_STICKY,这使我相信您对START_STICKY的真实含义有着不切实际的期望。 – 2015-04-03 21:05:13

+0

@Sauron:你在哪里见过? – 2015-04-04 13:49:09

+0

仍在研究,但不知道这是否正确。该服务用于发短信的应用程序,并且需要始终处于 – Sauron 2015-04-04 14:44:31

回答

2

所有你需要做的是返回START_STICKY国旗在onStartCommand()方法:

@Override 
public int onStartCommand (Intent intent, int flags, int startId){ 

    // several lines of awesome code 

    return START_STICKY; 
} 

进一步考虑:

如果使用Service无覆盖onStartCommand(),它返回START_STICKY默认情况下,尽管通常将Service运行的代码放入onStartCommand()方法中。

就是这样。你完成了,回家吧。

+0

代码块中的内容是什么?这个地方放在哪里? – Sauron 2015-04-03 20:19:24

+1

'onStartCommand()'是您的'Service'中的方法,您可以将所有代码放到您希望执行'Service'的地方 – 2015-04-03 20:22:59

+0

** START_STICKY **不会阻止服务在用户强行关闭应用程序时被杀死从任务管理器... – 2017-08-28 19:07:09

0

,以确保您的服务将继续在任务管理器被解雇后,运行的唯一办法,是让前台服务:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    startForeground(ONGOING_NOTIFICATION_ID, notification); 

    return super.onStartCommand(intent, flags, startId); 
} 

这里阅读:https://developer.android.com/guide/components/services.html#Foreground

返回START_STICKY单是不是解决方案。