android - 为什么我的服务会被多次实例化?

标签 android

IIUC,给定的 Android 服务应该只有一个实例,它是一个单例。

然而,我的服务被多次实例化,虽然我 什么都不做。

当服务崩溃时(例如当我通过adb卸载应用程序时),它 被安排重新启动(“计划重新启动崩溃的服务..”)。我 理解这是服务具有粘性的结果。

之后,当我的应用程序启动时,它会调用 startService() 和 bindService(),并且 服务得到适当的启动和绑定(bind)。但服务是 重新实例化并重复调用 onCreate() 计划重启。

然后每个实例等待客户端绑定(bind)和注册,但是 onBind() 只是 在“主”服务实例中调用。额外的实例稍等 客户端绑定(bind),并且由于没有发生,他们调用 stopSelf()。

但是 stopSelf() 对这些“死”实例完全没有影响,onDestroy() 永远不会被调用。

“主要”服务实例确实按预期工作,并且当它决定调用 stopSelf(), onDestroy() 确实被调用了。

更糟糕的是,所有这些死亡实例不断累积,它们永远不会被摧毁。 因此,他们唯一可能的结局就是崩溃(每次我都发生这种情况 通过 adb 启动/安装),从而安排重启。

所以最后我得到了很多这样的死实例,它们被重新启动了 大约每分钟一次。

有人知道这是怎么回事吗?

最佳答案

如果我使用 eclipse 重新启动具有远程服务的应用程序,我会遇到类似的行为。根据 logcat,系统认为被杀死的服务发生崩溃并尝试重新启动该服务。同时服务也随着重启的app一起重启了。由于某些未知原因,Android 系统没有意识到已经有一个正在运行的服务,并尝试启动一个新服务。

它在 Optimus one、Galaxy tab 和 EVO 3D 上多次发生。 Nexus one 没问题。

关于android - 为什么我的服务会被多次实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3804833/

相关文章:

java - 开发安卓应用 : emoji colors look faded

android - ActionBar 选项卡中的 Fragment 替换为 ViewPager

java - 如何对发送到 Activity 的不同 Extras 执行不同的操作?

android - 如何将以前的屏幕应用 Activity 启动到我的模拟器?

android - Java BufferedImage/Android 位图

java - 从Android中向用户显示的Dialog返回数据

java - 为什么 Android Firebase 会跳过身份验证 Activity

java - 将其从 Python 转换为 Java

java - OnListItem点击打开一个新的Fragment

java - 如何使用共享首选项存储和检索 recyclerview 数据