为什么我的服务多次实例化?

时间:2010-09-27 14:32:33

标签: android

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

但是,我的服务多次实例化,尽管我 什么都不做。

当服务崩溃时(例如,当我通过adb卸载应用程序时),它 计划重新启动(“计划重新启动崩溃的服务..”)。一世 了解这是服务粘性的影响。

之后,当我的应用程序启动时,它会调用startService()和bindService(),以及 服务得到适当的启动和约束。但是服务就是这样 重新调用onCreate()并重复调用onCreate() 计划重启。

然后每个实例等待客户端绑定和注册,但只有onBind() 在“主”服务实例中调用。其他实例稍等一下 客户端绑定,因为没有发生,他们调用stopSelf()。

但是stopSelf()在这些“死”实例中绝对没有效果,onDestroy() 永远不会被称为。

“main”服务实例按预期工作,并在决定调用时工作 确实调用了stopSelf(),onDestroy()。

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

因此,最终我得到了很多这些已经重新启动的死实例 大约每分钟一次。

有谁知道发生了什么事?

4 个答案:

答案 0 :(得分:2)

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

在Optimus one,Galaxy选项卡和EVO 3D上多次出现。对Nexus来说很好。

答案 1 :(得分:1)

因为我还没有看到你的代码,所以这只是一个猜测:也许你有一个内存泄漏,阻止服务正常破坏。这是我想到获得多个服务实例的唯一原因。例如,如果您的服务持有一些也具有对您的服务的引用的对象。内部类会发生很多事情。

从Google I / O查看此视频,看看此问题是否适用于您的服务以及如何找到它:http://www.youtube.com/watch?v=_CruQY55HOk&feature=player_embedded

答案 2 :(得分:0)

如果您在onstart()中使用该部分。如果您通过onclick按钮启动服务或者多次点击图标意味着,它将会做什么,如果服务已经运行,它将转到onstart(),因此该方法一次又一次地执行不是那个服务多次启动....你的方法运行了多次,这个我告诉我的猜测可能是确切的代码将正确解释

答案 3 :(得分:-1)

如果您的应用程序在崩溃时退出或者杀死它所属的进程,如System.exit(),它将在您的应用程序退出后启动,或者如果您的服务与Application在同一进程中运行,则启动它。 因为您终止了该过程,并且Android检测到您的服务不应该停止,因此Android会在您的应用退出后为您重新启动它。为什么服务重启后服务会重新启动,我认为这是Android的错误,它会为您的应用重新分配新流程,而不是将流程分配给您的服务。

那么,如何解决这个问题呢? 只需在AndroidManifest.xml中将属性android:process =“:background”(无论你想要什么,以:)开头设置到你的服务节点。希望它可以帮助你。