2013-03-18 107 views
9

我是Android新手。我正在開發一個記錄傳感器數據的應用程序。我有兩個按鈕的活動。當用戶按下開始按鈕時,我想要啓動服務並記錄傳感器數據,直到用戶按下停止按鈕。我不確定我想要使用哪種類型的服務。我讀了關於本地和遠程服務的內容,但我實際上並沒有明白其中的差別。Android服務在應用程序死亡時重新啓動

我試過至今:

我創建了一個活動與啓動和停止本地服務兩個按鈕:

//Start Service 
startService(new Intent(this, MyService.class)); 

//Stop Service 
stopService(new Intent(this, MyService.class)); 

我還創建了一個棘手的服務,onStartCommand()開始記錄傳感器數據:

public int onStartCommand(Intent intent, int flags, int startId) { 
    mSensorManager.registerListener(this, accelerometer, 
      SensorManager.SENSOR_DELAY_FASTEST); 
    mSensorManager.registerListener(this, magnetometer, 
      SensorManager.SENSOR_DELAY_UI); 
    mSensorManager.registerListener(this, lightSensor, 
      SensorManager.SENSOR_DELAY_UI); 
    Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show(); 
    return Service.START_STICKY; 
} 

AndroidManifest.xml:

<service android:name=".MyService" android:enabled="true" android:process=":HelloSensors_background"/> 

它運行良好,但問題是當我啓動該服務的kill the application時,此服務重新啓動並丟失所有以前記錄的數據。爲了使服務能夠順利運行並且即使在應用程序被殺害時仍繼續運行,以避免丟失任何已記錄的數據,我該如何使用?

+1

你是什麼意思殺死應用程序?如果用戶轉到應用程序的設置頁面並選擇「強制停止」,服務將被停止,但對此無能爲力。 – Premsuraj 2013-03-18 10:03:34

+0

[This](http://www.youtube.com/watch?v=XVyXCrM-3zw)就是我的意思,通過殺死應用程序 – user1135357 2013-03-18 10:11:29

+0

我第二個問題_你是什麼意思「殺死application_」?但是,我想指出的是,服務_can_可以與應用程序分開,以便如果用戶停止_app_,_service_可以繼續運行。 – 2013-03-18 10:11:58

回答

11

你的澄清關於殺人後:

你可能想在不同的進程中運行你的Service比你Application,你可以通過在你的清單這樣的聲明實現:

<service 
    android:name=".ServiceClassName" 
    android:process=":yourappname_background" > 
    ... 

使用清單中任何receiver聲明的android:process屬性都是相同的。

如果您只想接收可在清單中聲明的​​事件,則可以考慮使用IntentService,由於其活動時間較短,用戶幾乎不會看到該事件。但是,如果您需要收聽以編程方式註冊收件人時纔會收到的事件(在這種情況下,顯然,清單中的receiver子句沒有意義),那麼您無法對用戶(或其中一個「智能應用程序殺手「)會導致您的服務中斷。優點仍然是用戶希望瞭解您的應用可能會被殺死,而您的Service則不能(如果他們想要做某件事)。

此外,你可以bring your Service to the foreground

+2

將服務引入前臺解決了我的問題。非常感謝:) – user1135357 2013-03-18 10:59:29

+0

你在OnTaskRemoved()中把它帶到了哪裏? – 2016-05-03 18:01:49

+0

@ user1135357可能不知道你的問題,如果你不像我在這裏,TaRanLaYal那樣包含別名。 - 很遺憾,我的答案中的參考文獻今天部分中斷,但您仍然可以自己在頁面上找到該部分。無論哪種方式,也許user1135357可以闡明他的具體解決方案。 – 2016-05-04 05:53:19

-3

我想你必須在AndroidManifest.xml中聲明服務。

+1

True;這與這個問題有什麼關係? – 2013-03-18 10:11:19

+0

好吧,它與您提供的例外情況相同(我沒有自己的代碼可以訪問)。我必須在我的一個應用程序中做類似的事情,這就是爲什麼我不需要澄清;我意識到用戶之後是什麼。在說,我不能提供像你一樣詳細的答案,因爲我對Android還很陌生。但我可以解釋一下這個要求的原因。對於那個很抱歉。 – 2013-03-18 11:45:46

相關問題