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