在我的Android应用程序中,我重载了Application类,并更新了清单中的标记。此应用程序还会创建Android服务。 我已经在我的Application类的onCreate中放了一些日志,我看到它被调用了两次。 第一次是我的应用程序启动时(这是预期的)然后,它通常是在创建服务之后。 日志还显示正在创建Application的第二个实例。 (我打印“this”值,它们是不同的。)
我认为应用程序将创建为单例。 这是因为我创建了一个服务吗?
答案 0 :(得分:28)
是的,如果您使用了android:process,那么您可以在单独的进程中运行它,因此当服务启动时,会为它启动一个新进程,因此需要创建该进程的新Application对象。
但是存在一个更基本的问题 - Application对象启动其中一个服务是不对的。重要的是,不要将应用程序与您在另一个操作系统中考虑“应用程序”的方式混淆。 Application对象不会驱动应用程序。它只是该流程中应用程序的全局状态。事实上,Application对象完全是多余的 - 你从不需要一个人编写Android应用程序。一般来说,我实际上建议人们不要使用它。它比其他任何事情都更容易造成麻烦。
另一种表达方式:真正定义应用程序的是它的活动,服务,接收器和提供者标签的集合。那些是“推出”。所有应用程序都是在初始化应用程序进程时创建的。它没有自己的生命周期,只是在那里为应用程序中的其他真实组件提供服务。
所以在设计应用时只需忽略应用;它会减少混乱。 (取而代之的是,我更喜欢将全球单身人士用于这种状态。)
另外作为一般规则,我建议不要使用android:process。它肯定有一些用途,但绝大多数时候它不需要它只会使应用程序使用更多的RAM,效率更低,更难写(因为你不能在单个进程中利用全局变量) 。如果你到达一个真正有理由使用android:process。
的地方,你应该很明显答案 1 :(得分:3)
服务不应该真的被认为是一个活动,如果你这么想,你一定会遇到问题。服务和活动可以属于同一个应用程序,如果您在AndroidManifest.xml
中以这种方式定义它们,但它们的行为不同并且具有不同的生命周期。如果您希望在不同的流程中使用服务,则可以在android:process="string"
部分设置<service>
,使其名称与您的应用程序名称不同。当您处于单独的进程中时,您将无法访问全局变量,并且您应该通过Intents与您的服务进行通信。如果您的服务更复杂,您可能希望通过AIDL远程调用它。如果您想要单身人士活动,请将该活动的launchMode
设置为singleInstance
或singleTask
。 singleInstance
表示它将是该任务堆栈中此活动的第一个也是唯一一个实例,并且不会为任何新Intent创建新实例。由于它是此Activity的唯一实例,因此它始终位于任务堆栈的顶部,并且始终能够处理针对此Activity的新Intent。如果Activity被声明为singleTask
,它也将是一个单例,但可能在同一个任务堆栈中有其他活动,甚至可能在其上方的任务堆栈顶部有活动。这是一个值得注意的重要区别。请记住这一点:在任务堆栈顶部 NOT 的单例活动无法处理新的Intent,并且将删除Intent。如果您希望您的Activity始终能够处理发往它的所有新Intent,那么您很可能想要使用singleInstance
答案 2 :(得分:1)
问题是服务也是一个组件,有自己的生命周期,只是它没有用户界面。 您应该检查developer application fundamental s以获取替代方案。