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

时间:2012-05-18 00:37:04

标签: android service background

在开发者网站上阅读了有关Android服务的大部分可用文档,并且在stackoverflow中,我仍然对在单独任务中运行服务的几个方面感到困惑。希望有人能让我走上正轨。

假设我们有轻量级服务框架,例如

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,但它似乎更适合运行任务然后终止。

2 个答案:

答案 0 :(得分:2)

  

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

将服务放在自己的进程中。这通常是需要避免的,因为它消耗额外的RAM和CPU(用于IPC)。您可以通过创建Thread或任意数量的其他方法来创建一个线程,其中大多数已经在Java中使用了十年左右。

  

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

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

  

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

从后台主题调用dummytask()

  

我是否需要使用AIDL?

没有。您的服务可以广播Intent,或者调用活动提供的PendingIntent,或通过活动提供的Message发送Messenger等。最好的是使用Android支持包中的LocalBroadcastManager,但这不适用于跨进程边界,迫使您进入更昂贵的通信选项。

答案 1 :(得分:0)

我认为您可以使用IntentService来设置(常规)警报(AlarmManager.setRepeating),其中包含PendingIntent。您可以通过IntentService广播意图并通过BroadcastReceiver在您的用户界面中接收来通知用户界面。