簡體   English   中英

如何在android服務中啟動長時間運行的后台任務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM