【发布时间】:2012-01-12 04:43:51
【问题描述】:
我有一个服务在它自己的进程中运行。晚上看起来还不错,但在我入睡后,我认为 Android 会对其进行处理。
我认为当 Android 终止服务时不会调用 onDestroy() 是否正确?如果没有,是否还有其他记录杀戮的地方?
我想我需要研究一下AlarmManager。
【问题讨论】:
标签: android service kill-process
我有一个服务在它自己的进程中运行。晚上看起来还不错,但在我入睡后,我认为 Android 会对其进行处理。
我认为当 Android 终止服务时不会调用 onDestroy() 是否正确?如果没有,是否还有其他记录杀戮的地方?
我想我需要研究一下AlarmManager。
【问题讨论】:
标签: android service kill-process
我有一个服务在它自己的进程中运行。
为什么它在自己的进程中?
我认为当 Android 终止服务时不会调用 onDestroy() 是否正确?
可以,也可以不可以。
如果没有,是否还有其他记录杀死的地方?
没有。
我想我需要研究一下 AlarmManager。
用户讨厌永远存在的服务,这就是任务杀手流行的原因。他们更讨厌在自己的进程中运行的服务,因为它们消耗额外的 RAM、CPU 和电池,通常没有充分的理由。
如果您的目标是定期做某事,请使用AlarmManager——这就是它存在的原因。
【讨论】:
根据开发者文档中的Service lifecycle,当服务被杀死或停止时会调用onDestroy()方法。
另外,如果一个应用程序有一个服务在后台运行(即一个音乐播放器在后台播放),系统会认为这个应用程序是活动的,并且不会杀死它的进程,除非极端条件(我不认为它在实践中发生)。
文件说:
Note this means that most of the time your service is running, it may be killed by the system if it is under heavy memory pressure. If this happens, the system will later try to restart the service. An important consequence of this is that if you implement onStartCommand() to schedule work to be done asynchronously or in another thread, then you may want to use START_FLAG_REDELIVERY to have the system re-deliver an Intent for you so that it does not get lost if your service is killed while processing it.
在这里,我在想的是,如果一个服务被操作系统杀死,操作系统稍后会尝试重新启动它。但是,在这种情况下,是否调用了 onDestroy() 方法?我不确定。有人对此进行过测试吗?
【讨论】:
onDestroy() 不保证被调用。
onDestroy() 不保证会被调用。服务也一样吗?该文档指出:“如果服务当前正在其 onCreate()、onStartCommand() 或 onDestroy() 方法中执行代码,那么托管进程将是一个前台进程,以确保该代码可以在不被杀死的情况下执行。”但是,我从来没有测试过这个。
onDestroy()。