1

有人可以确认我是否遵循了所需功能的正确设计吗?

当我的应用程序至少在设备上运行一次时,我需要通过广播接收器侦听两种类型的意图,而该设备无法在 AndroidManifest 中注册:

  • android.intent.action.SCREEN_ON
  • android.intent.action.SCREEN_OFF

出于这个原因,我创建了一个服务,它在我的 MainActivity 启动时启动。使用服务的方法onStartCommand,我注册了这些广播接收器......

接下来在这些广播接收器中,根据从 SharedPreferences 获取的标志完成一些事情,0(不做任何事情)或 1(做正确的逻辑)

我是否正确理解了服务的生命周期,它不会被 Android 停止/杀死(假设它不会导致任何设备干扰和过载),即使 MainActivity 将从内存/堆栈中删除并且意图将被监听?

4

1 回答 1

2

一些东西:

  • 而是在服务中注册接收器,onCreate()因为此方法仅在创建服务时调用一次。如果您startService()多次调用,则会导致更多调用onStartCommand(),这意味着您不断地重新制作接收器。

请注意,对 Context.startService() 的多次调用不会嵌套(尽管它们确实会导致对 onStartCommand() 的多次相应调用),因此无论启动多少次服务都将停止一次 Context.stopService() 或 stopSelf () 叫做;

  • 确保取消注册您的接收器。我通常这样做onDestroy()

另外,关于您的生命周期问题 - 一个正常的服务不应该无缘无故地被杀死,并且应该独立于启动它的 Activity 运行(绑定的服务与我记得的有点不同)但它仍然在 UI 线程和相同的进程中运行(除非您另有说明)。但是,如果经过很长时间并且您的服务不在前台。它有被杀死的可能性。这就是为什么你应该做onStartCommand()return START_STICKY。如果系统确实杀死了服务,当它可以时,它会重新启动它。如果您的服务在前台,它也可能会被杀死,但这是最后的手段。START_STICKY如果您的服务容易出错,可能会很糟糕。例如,我的服务不断崩溃。START_STICKY让它在一段时间后重新启动,然后再次崩溃,循环重复。

在正常情况下,您的服务不会被杀死的唯一情况是:

如果服务当前正在其 onCreate()、onStartCommand() 或 onDestroy() 方法中执行代码,则托管进程将是前台进程,以确保此代码可以在不被杀死的情况下执行。

于 2013-03-05T23:02:01.537 回答