Android 阻止服务重新启动

Android 阻止服务重新启动,android,restart,intentservice,Android,Restart,Intentservice,我有一个IntentService,它是通过startService(服务)从广播接收器启动的。当我在BroadcastReceiver中获得新信息时,新信息会通过一个带有startService(service)的intent再次推送到IntentService,但随后服务会重新启动。我能阻止吗?我想将新信息推送到IntentService,而无需重新启动。我假设您需要共享一些状态,以便在服务中处理后续的意图。我看到两种解决办法: 使用IntentService并在OnHandleConten

我有一个IntentService,它是通过startService(服务)从广播接收器启动的。当我在BroadcastReceiver中获得新信息时,新信息会通过一个带有startService(service)的intent再次推送到IntentService,但随后服务会重新启动。我能阻止吗?我想将新信息推送到IntentService,而无需重新启动。

我假设您需要共享一些状态,以便在服务中处理后续的意图。我看到两种解决办法:

  • 使用IntentService并在OnHandleContent中保存和恢复此状态
  • 使用已启动的服务,并将此状态作为服务类中的字段保存。为了防止ANR,在UI线程之外处理意图,就像。要保持服务运行,只需从中删除呼叫

  • 如果您可以恢复和保存每个已处理意图的状态,那么第一个解决方案会更安全,因为如果内存不足,操作系统可能会终止您的服务。

    意图服务旨在以意图启动,执行其作业并完成。从这个角度看,它们更像是一个异步任务。这就是intentservice重新启动的原因

    OnHandleContent
    应该做一些工作并完成。您可以使用一些技巧使其阻塞,但这与intent服务的性质背道而驰


    你应该做的是拥有一个经典的服务。如果您遇到ANR错误,您应该在一个线程或服务本身中承载的异步任务中执行所有时间密集型操作。

    因此,您希望
    IntentService
    不像
    IntentService
    那样工作?我尝试了一个正常的服务,但后来发现ANR有问题,所以我切换到了IntentService。正常的服务是完美的,只有ANR是问题所在。。。那我该怎么办?IntentService和普通服务的主要区别在于IntentService有一个WorkerThread,对吗?我可以在正常服务中也这样做吗?如果有新的意图出现在服务中,我应该如何启动WorkerThread?您是否在
    onHandleIntent
    onStartCommand
    中实现了代码?当我使用IntentService时,我在onHandleIntent中实现了接收新信息的代码。使用普通服务时,我通过onStartCommand函数获得新信息。如果我使用普通服务,则只会在第一次调用
    onStart
    方法,当我调用
    context.startService(Service)
    第二次调用时,只会调用
    onStartCommand
    方法,对吗?在
    onStartCommand
    方法中,我只有这个代码
    final Bundle extras=intent.getExtras();string1=extras.getString(“string1”);string2=extras.getString(“string2”);通知nf=新通知(字符串1、字符串2);添加数据(nf);adapter.notifyDataSetChanged()它将一个新项目放入我的listView。这需要这么多时间吗?我想说,您可以随时依靠onStartCommand(也是第一次)获得调用。如果您在执行一些时间密集型操作时遇到了一个错误,那么您需要识别它们并将其放在另一个线程中。如果您不确定它们是哪一个,可以启用StrictUserMode。StrictMode只显示
    03-18 23:58:28.494:D/StrictMode(15451):StrictMode策略冲突~持续时间=1481毫秒:android.os.StrictMode$StrictModeDiskReadViolation:policy=31违例=203-18 23:58:28.494:D/StrictMode(15451):在android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1107)03-19 00:01:50.234:D/StrictMode(15576):违例~持续时间=413毫秒:android.os.StrictMode$StrictModeDiskReadViolation:policy=31违规=203-19 00:01:50.234:D/StrictMode(15576):在android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1107)
    上,这意味着您正在从存储读取某些内容。您应该识别它并将其移动到asynctask(或更复杂的任务)中。我不从存储中读取任何内容。。。我只有一个PreferenceActivity,但除此之外我什么都不读。
    在UI线程之外处理意图
    我应该如何做?请参阅IntentService实现(我答案中的链接)以了解如何做。因为您不希望在处理完所有意图后停止服务,所以不要调用stopSelf()(在我的回答中也提到)。