2013-03-17 153 views
0

我有一个IntentService,它是从BroadcastReceiver启动的,启动服务,服务地址为。当我在BroadcastReceiver中获得新信息时,新的信息将通过startService(服务)的意图再次推送到IntentService,但随后服务将重新启动。我能阻止这个吗?我想将新信息推送到IntentService而不用重新声明它。阻止服务重新启动

+0

所以你想'IntentService'不像'IntentService'那样工作吗? – 323go 2013-03-17 16:45:33

+0

我尝试了一个正常的服务,但后来我有ANR的问题,所以我切换到一个IntentService。正常的服务是完美的,只有ANR是问题...所以我能做什么? IntentService和普通Servic的主要区别在于IntentService有一个WorkerThread,对吗?我也可以在普通服务中这样做吗?我应该如何启动WorkerThread,然后是否有新的Intent进入服务? – Cilenco 2013-03-17 17:30:43

+0

你在'onHandleIntent'或'onStartCommand'中实现了你的代码吗? – 323go 2013-03-17 17:45:09

回答

0

我假设你需要分享一些状态来处理你的服务中的后续意图。我看到两种解决方案:

  1. 使用IntentService并在onHandleIntent中保存和恢复此状态。
  2. 使用启动的Service,并将此状态作为Service类中的字段保存。为了防止ANR,在UI线程之外处理Intents,就像IntentService does一样。要使服务保持运行,只需从handleMessage中删除stopSelf呼叫。

如果您可以避开每个经过处理的Intent的恢复和保存状态,则第一种解决方案更安全,因为您的服务在内存不足时可能会被OS终止。

+0

'处理UI线程之外的意图'我应该怎么做? – Cilenco 2013-03-18 23:33:35

+0

查看IntentService实现(链接在我的答案中)以查看如何完成。既然你不希望你的服务在所有的Intents被处理后停止,不要调用stopSelf()(在我的答案中也提到)。 – chalup 2013-03-19 21:15:35

1

意向服务旨在以意向开始,执行他们的工作并完成。从这个角度来看,它们更像是一个异类。这就是您的intentservice重新启动的原因。

onHandleIntent应该做一些工作并完成。你可以做一些技巧来阻止它,但这会违背意图服务的性质。

你应该做的是有一个经典的服务。如果你得到ANR错误,你应该在一个线程内执行所有的时间密集型操作,或者在服务内部托管一个async服务器。

+0

如果我使用正常的服务,'onStart'方法只在第一次被调用,而我只在第二次调用'context.startService(service)'时调用'onStartCommand'方法,对吗?在'onStartCommand'方法中,我只有这个代码'final Bundle extras = intent.getExtras(); String string1 = extras.getString(“string1”); String string2 = extras.getString(“string2”);通知nf =新通知(string1,string2); data.add(NF); adapter.notifyDataSetChanged();'它把一个新的项目给我的listView。这需要很多时间吗? – Cilenco 2013-03-18 22:07:28

+0

我想说,你总是可以依靠onStartCommand来获得调用(第一次)。如果您正在执行ANR错误,那么您需要在那里执行一些时间密集型操作,您需要识别它们并放入另一个线程中。如果你不确定它们是哪一个,你可以启用strictusermode – fedepaol 2013-03-18 22:17:57

+0

StrictMode只会说'03-18 23:58:28。494:D/StrictMode(15451):StrictMode策略违规; 〜duration:1481 ms:android.os.StrictMode $ StrictModeDiskReadViolation:policy = 31 violation = 2 03-18 23:58:28.494:D/StrictMode(15451):at android.os.StrictMode $ AndroidBlockGuardPolicy.onReadFromDisk(StrictMode。 java:1107) 03-19 00:01:50.234:D/StrictMode(15576):StrictMode策略违规; 〜duration:413 ms:android.os.StrictMode $ StrictModeDiskReadViolation:policy = 31 violation = 2 03-19 00:01:50.234:D/StrictMode(15576):at android.os.StrictMode $ AndroidBlockGuardPolicy.onReadFromDisk(StrictMode。 java:1107)' – Cilenco 2013-03-18 23:04:06