[英]How to start long running background task in android service
閱讀了開發者網站上的Android服務的大部分可用文檔,並在stackoverflow中,我仍然對在單獨任務中運行服務的幾個方面感到困惑。 希望有人可以讓我走上正軌。
假設我們有像trival這樣的服務框架
public class HliService extends Service {
@Override
public void onCreate() {
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// If we get killed, after returning from here, restart
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
// We don't provide binding, so return null
return null;
}
@Override
public void onDestroy() {
}
}
在清單中,我有
<service android:name=".HliService" android:process=":HLI_Comms"/>
這樣服務就可以在自己的線程中運行。
該服務的目的是提供一個后台任務,該任務將使用TCP套接字與設備通信並執行其他操作。 有可能忽略電池問題等,基本上我希望它能永遠運行。
就像是
// Method that communicates using a TCP socket, and needs to send
// information back to the activity and receive messages from activity
// not shown here.
private void dummytask() {
boolean keepGoing = true;
while (keepGoing) {
// do useful stuff in here
// sets keepGoing false at some point
}
stopSelf();
}
啟動此方法/任務的最佳方法是什么?
我查看了開發人員站點中使用消息處理程序和looper的代碼,我只是部分理解,但它似乎非常復雜,可能比我要求的更多?
我不相信我可以從onCreate()
或onStartCommand()
調用此方法,因為從系統調用時它們都不會完成? 我應該用定時器或鬧鍾啟動嗎?
我需要添加一個消息處理程序來與gui活動進行通信,但由於我在另一個線程中啟動服務(憑借清單“進程”指令),我是否需要使用AIDL?
我也看過使用AysnchTask而不是擴展Service,但它似乎更適合運行任務然后終止。
這樣服務就可以在自己的線程中運行。
這使服務處於自己的過程中 。 這通常是需要避免的,因為它消耗額外的RAM和CPU(用於IPC)。 您可以通過創建一個Thread
或任何其他方法來創建一個Thread
,其中大多數已經在Java中使用了十年左右。
有可能忽略電池問題等,基本上我希望它能永遠運行。
服務幾乎不可能永遠運行。 用戶或操作系統最終將擺脫您的服務。
啟動此方法/任務的最佳方法是什么?
從后台線程調用dummytask()
。
我需要使用AIDL嗎?
不可以。您的服務可以廣播Intent
,或者調用活動提供的PendingIntent
,或者通過活動提供的Messenger
等發送Message
。最好的方法是使用Android支持包中的LocalBroadcastManager
,但不會跨越流程邊界,迫使您進入更昂貴的通信選項。
我認為您可以使用一個IntentService
,它通過設置一個帶有PendingIntent
的(常規)警報( AlarmManager.setRepeating
)來運行。 您可以通過從IntentService
廣播Intent並通過BroadcastReceiver
在UI中接收它來通知UI。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.