2015-02-09 142 views
0

我試圖在android中執行StartedService以定期將用戶位置發送到服務器。 直到現在,我設法創建服務並從「父」應用程序啓動它,並且我不知道如何在應用程序被終止後保持它活着。從我在互聯網上發現'StartCommandResult.Sticky'應該重新啓動服務,如果這一個被殺害,但由於某種原因,這不會重新啓動。在應用程序被終止後重新啓動Android Started Service

我overried的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)中的答案。

回答

1

覆蓋onStartCommand這樣

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

official documentation指出:

服務被 「啓動」,當一個應用程序組件(例如, 活性)通過調用startService啓動它( )。一旦啓動,服務 可以無限期地在後臺運行,即使啓動它的組件已被銷燬。通常,啓動的服務執行單個操作,並且不會將結果返回給調用者。例如,對於 ,它可能通過網絡下載或上傳文件。當 操作完成時,服務應該自行停止。

因此,啓動服務這樣

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

將有你的服務甚至當你的應用程序被破壞運行。

關於正式文件Service.START_STICKY:

如果系統onStartCommand後殺死服務()返回時, 重新創建服務和呼叫onStartCommand(),但不要重新傳遞 最後的意圖。系統調用onStartCommand(),其意圖爲 ,除非有未決意圖啓動服務, (在這種情況下,這些意圖被傳遞)。這適用於不執行命令的媒體 播放器(或類似的服務),但 無限期地運行並等待工作。

+0

StartCommandResult.Sticky添加您的服務是Service.START_STICKY的xamarin相當。所以這不是我想的問題。 – 2015-02-09 09:08:55

+0

從文檔中,你的'Service'應該無限期地運行。你確定它沒有運行嗎?你如何檢查? @AlexStefan – Marcus 2015-02-09 09:12:40

+0

那麼我檢查服務器是否在應用程序被終止後仍然發送它的位置,事實並非如此。 – 2015-02-09 09:13:57

1

對於我來說,一切都在代碼是正確的,但問題是在使用調試的同時檢查如果服務上。當我使用發行版本(或只是開發版本而不連接到調試)時,進程不會被終止,並且服務正常運行。

不知道爲什麼。我正在使用Xamarin Studio 6.0。

+0

只是我需要一個幫助後臺服務的代碼可以寫在xmarain.forms跨平臺,如果是的任何機會,如果你有任何示例的例子可以請你提供我 – 2017-04-06 09:55:29

1

這是我如何做,但它在JAVA代碼。

在您的服務中,您應該實施LocalBinder,onStartCommandonCreate方法。

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> 
相關問題