2010-11-07 66 views
1

我有一個應用程序在啓動時使用廣播接收器啓動,同時我也有一個活動和一個進程,因爲服務必須始終在後臺運行我正在啓動它自己的進程上的服務使用android:process清單標籤。在單獨的線程上運行的android服務

ui僅適用於表示需求,我希望用戶能夠運行該服務,即使該活動未處於活動狀態。

我用這額外的參數啓動服務:

intent.putExtra(Intent.EXTRA_DONT_KILL_APP, true); 

的問題是,當我按下後退按鈕或home鍵的活動對破壞方法被調用和服務儘管看起來它的運行(它出現在任務管理器上)其行爲不如預期,它應該連接到網絡併發送一些數據,但每X時間使用一個計時器任務,但任務不會觸發,因此數據永遠不會發送。

回答

1

因爲該服務必須在後臺

始終運行,請不要那樣做。對於初學者來說,這是不可能的,因爲Android會殺了你,用戶會把你殺掉。考慮到你在當前的實現中浪費了多少RAM,兩者都會試圖以更快的速度殺死你。

我開始使用android:process清單標記自己的進程的服務。

請不要這樣做。你浪費RAM沒有任何好處。您無需爲此服務提供單獨的流程。

我用這額外的參數啓動服務:

該參數沒有做什麼,你認爲它。它不用於啓動服務。

它應該連接到網絡,併發送一些數據,但每X時間使用定時器任務,但任務不會觸發,因此數據永遠不會發送。

步驟#1:擺脫你現有的服務。

步驟#2:使用AlarmManagerWakefulIntentService。 「每隔X次」安排一次警報(可能使用啓動時間接收器)。請將WakefulIntentService「連接到網絡併發送一些數據」。

+0

感謝您的建議,但是1我使用的是大約3 MB的ram,它與在手機上運行的其他任何服務都沒有太大的區別,2它用於什麼(額外的參數)? 3爲什麼不使用單獨的過程?我應該什麼時候? 4我知道警報管理員,但我希望我的更新在警報管理員無法保證的特定時段進行。 – maxsap 2010-11-07 01:03:56

+0

@maxasp:1. Android不會在意。用戶不會在意。 2. http://developer.android.com/reference/android/content/Intent.html#EXTRA_DONT_KILL_APP 3.因爲你浪費了兩倍的RAM,沒有任何好處。 「AlarmManager」工作得很好,謝謝。如果您有相反的證據,請發佈。 – CommonsWare 2010-11-07 01:07:57

+0

實際的應用程序是活動僅在程序第一次運行的服務,所以爲什麼要使用雙RAM?請解釋一下,android會收回活動進程使用的內存(如果我錯了,請糾正我)。我已經閱讀過那篇文章,那就是爲什麼當我說「覆蓋重新啓動應用程序的默認操作」的時候使用它並不會導致這些服務?不知道setRepeating方法抱歉,但我可以動態更改間隔嗎?在當前形式中,服務獲得關於新時間間隔的通知並設置計時器任務。 – maxsap 2010-11-07 01:40:47

0

我完全同意CommonsWare的回答。但是,如果你真的不想打擾用戶尚未另一種無用的服務,其中,位於合的背景,剛剛吃內存,你可以使用以下命令:

在你的活動:

Intent serviceIntent = new Intent(this, UpdateService.class); 
serviceIntent.setAction(Intent.ACTION_MAIN); 
startService(serviceIntent); 

在服務:

public int onStartCommand(Intent intent, int flags, int startId) { 
    if (intent != null) { 
     .. do something here 
    } 
    return Service.START_STICKY; 
} 

再次,請不要這樣做只是定期地執行一些動作。請使用AlarmManager!

相關問題