Android应用程序类被调用两次

在我的Android应用程序中,我重载了Application类,并且更新了我的清单中的标签。 此应用程序还创build一个Android服务。 我已经把我的应用程序类的onCreate一些日志,我看到它被调用两次。 第一次是当我的应用程序启动(这是预期的),然后,通常是在创build服务之后。 该日志还显示正在创build应用程序的第二个实例。 (我打印“这个”的价值,他们是不同的)。

我以为应用程序将被创build为一个单身人士。 这是因为我创build一个服务?

Solutions Collecting From Web of "Android应用程序类被调用两次"

是的,如果你使用了android:process,那么你需要在一个单独的进程中运行它,所以当服务启动时,一个新的进程就开始了,因此需要创build一个用于该进程的新的Application对象。

但是还有一个更基本的问题 – 一个Application对象启动它的一个服务是不对的。 不要将应用程序与其他操作系统中的“应用程序”相混淆,这一点很重要。 Application对象不会驱动应用程序。 在这个过程中,它只是应用程序的一个全局状态。 实际上,Application对象是完全多余的 – 你永远不需要编写一个Android应用程序。 一般来说,我实际上build议人们不要使用它。 比其他事情更容易造成麻烦。

另一种方式来说明:真正定义应用程序的是它的活动,服务,接收者和提供者标签的集合。 那些是“发射”的。 所有的应用程序,都是作为初始化应用程序进程的一部分而创build的。 它没有自己的生命周期,它只是在那里为应用程序中的其他实际组件。

所以在devise你的应用时就忽略应用。 这将减less混淆。 (取而代之,我更喜欢使用全局单例来表示这种状态。)

另外作为一般规则,我build议不要使用android:process。 这当然有一些用处,但绝大多数情况下它不是必需的,只是使应用程序使用更多的RAM,效率更低,更难编写(因为在单个进程中无法利用全局variables) 。 如果你到达一个真正有理由使用android:process的地方,应该很明显。

一个服务不应该被认为是一个活动,如果你这样想,你肯定会遇到问题。 服务和活动可以属于同一个应用程序,只要你在AndroidManifest.xml以这种方式定义它们,但是它们的行为不同,并且具有不同的生命周期。 如果你想在不同的进程中使用你的服务,那么你可以在<service>部分设置android:process="string"来给它一个与你的应用程序名称不同的名字。 在单独的进程中,您将无法访问全局variables,您应该通过Intents与您的服务进行通信。 如果你的服务更复杂,你可能想要通过AIDL来远程调用它。 如果你想要一个singleton activity,那么把这个Activity的launchMode设置为singleInstance或者singleTasksingleInstance意味着它将是任务堆栈中此Activity的第一个也是唯一的实例,并且不会为任何新的Intents创build新的实例。 由于这是该活动的唯一实例,因此它始终位于任务堆栈的顶部,并始终处理指向此Activity的新Intents。 如果活动被声明为singleTask它也将是一个单身人士,但可能在同一个任务堆栈中有其他的活动,甚至可能在上面的任务堆栈顶部有活动。 这是一个重要的区别要注意。 请记住:单身属于任务堆栈顶部的活动不能处理新的意图,而意图将被丢弃。 如果您希望您的活动始终能够处理所有指定给它的新内容,那么您很可能希望使用singleInstance

问题是,一个Service也是一个组件,它有自己的生命周期,只是它没有一个用户界面。 你应该检查开发者应用程序的基础 。