如何在android服务中启动长时间运行的后台任务

Ste*_*eJP 7 service android background

阅读了开发者网站上的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() {
    }
}
Run Code Online (Sandbox Code Playgroud)

在清单中,我有

<service android:name=".HliService" android:process=":HLI_Comms"/>
Run Code Online (Sandbox Code Playgroud)

这样服务就可以在自己的线程中运行.

该服务的目的是提供一个后台任务,该任务将使用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();
}
Run Code Online (Sandbox Code Playgroud)

启动此方法/任务的最佳方法是什么?

我查看了开发人员站点中使用消息处理程序和looper的代码,我只是部分理解,但它似乎非常复杂,可能比我要求的更多?

我不相信我可以从任何一个调用此方法,onCreate()或者onStartCommand()从那时起从系统调用时都不会完成?我应该用定时器或闹钟启动吗?

我需要添加一个消息处理程序来与gui活动进行通信,但由于我在另一个线程中启动服务(凭借清单"进程"指令),我是否需要使用AIDL?

我也看过使用AysnchTask而不是扩展Service,但它似乎更适合运行任务然后终止.

Com*_*are 2

以便服务在自己的线程中运行。

这将服务置于其自己的流程中。这通常是要避免的,因为它会消耗额外的 RAM 和 CPU(对于 IPC)。您可以通过创建一种或任意数量的其他方式来创建线程Thread,其中大多数方式已经在 J​​ava 中存在了十年左右。

冒着忽略电池问题等的风险,基本上我希望它永远运行。

服务永远运行几乎是不可能的。用户或操作系统最终将摆脱你的服务。

启动此方法/任务的最佳方式是什么?

dummytask()从后台线程调用。

我需要使用 AIDL 来代替吗?

不。您的服务可以广播Intent,或调用PendingIntent活动提供的 ,或Message通过Messenger活动提供的发送 ,等等。最好是使用LocalBroadcastManagerAndroid 支持包中的 ,但这不能跨进程边界工作,迫使您选择更昂贵的通信选项。