2015-04-03 516 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單是不是解決方案。