Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android应用程序类被调用两次_Android - Fatal编程技术网

Android应用程序类被调用两次

Android应用程序类被调用两次,android,Android,在我的Android应用程序中,我重载了应用程序类,并更新了清单中的标记。该应用程序还创建了一个Android服务。 我在我的应用程序类的onCreate中放了一些日志,我看到它被调用了两次。 第一次是当我的应用程序启动时(这是预期的),然后,通常是在创建服务之后。 日志还显示正在创建应用程序的第二个实例。 (我打印“this”值,它们是不同的) 我认为应用程序将被创建为单例。 这是因为我创建了一个服务吗?问题是服务也是一个组件,有自己的生命周期,只是它没有用户界面。 您应该检查s以寻找替代方案

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

我认为应用程序将被创建为单例。
这是因为我创建了一个服务吗?

问题是服务也是一个组件,有自己的生命周期,只是它没有用户界面。
您应该检查s以寻找替代方案。

一项服务不应该真正被视为一项活动,如果您这样想,您以后肯定会遇到问题。如果在
AndroidManifest.xml
中以这种方式定义服务和活动,则它们可以属于同一个应用程序,但它们的行为不同,并且具有不同的生命周期。如果您希望您的服务位于不同的进程中,那么您可以在
部分中设置
android:process=“string”
,为其指定一个不同于您的应用程序名称的名称。当全局变量位于单独的流程中时,您将无法访问它,您应该通过意图与您的服务通信。如果您的服务更复杂,您可能需要考虑通过AIDL远程调用它。如果需要单例活动,则将该活动的
launchMode
设置为
singleInstance
singleTask
singleInstance
意味着它将是其任务堆栈中此活动的第一个也是唯一一个实例,并且不会为任何新意图创建新实例。由于它是此活动的唯一实例,因此它将始终位于任务堆栈的顶部,并且始终能够处理指向此活动的新意图。如果活动被声明为
singleTask
,它也将是一个单例,但可能在同一任务堆栈中有其他活动,甚至可能在其上方的任务堆栈顶部有活动。这是一个需要注意的重要区别。请记住:位于任务堆栈顶部的而不是的单例活动无法处理新的意图,并且意图将被删除。如果您希望您的活动始终能够处理所有指定给它的新意图,那么您很可能希望使用
singleInstance

是的,如果您使用了android:process,那么它将在一个单独的进程中运行,因此,当服务启动时,将为其启动一个新流程,因此需要为该流程创建一个新的应用程序对象

但还有一个更基本的问题——应用程序对象启动其服务之一是不正确的。重要的是,不要将应用程序与在另一个操作系统中如何看待“应用程序”混淆。应用程序对象不驱动应用程序。这只是应用程序在该过程中的全局状态。事实上,应用程序对象是完全多余的——编写Android应用程序永远不需要应用程序对象。一般来说,我建议人们不要使用它。它比其他任何东西更容易引起麻烦

另一种说法是:真正定义应用程序的是其活动、服务、接收者和提供者标记的集合。这些就是“启动”的内容。应用程序的全部内容都是在初始化应用程序的过程中创建的。它没有自己的生命周期,只是为应用程序中的其他真实组件提供服务

所以,在设计应用程序时,只需忽略应用程序;这将减少混乱。(取而代之的是,我更喜欢在这种状态下使用全局单例。)


同样作为一般规则,我建议不要使用android:process。它当然有一些用途,但绝大多数情况下并不需要它,只会使应用程序使用更多的RAM、更低的效率和更难编写(因为您无法在单个进程中利用全局性)。如果你到达了一个有充分理由使用android:process的地方,这对你来说应该是显而易见的。

似乎这个问题可能与我使用android:process标记在清单中声明我的服务有关。这有意义吗?是的。我刚刚查阅了同样的信息来源,这也是我所理解的。但是我没有测试。你的信息来源是什么?我很想知道如何处理这个案子。一个服务创建自己的进程并不少见,应用程序类应该是一个可以共享全局对象的“单例”。
android.app.Service
android.app.Activity
。你从哪里知道服务是一项活动?它们位于完全不同的软件包中,您引用的文档清楚地说明了它们的用途完全不同。“is-a”关系通常意味着某种形式的继承或“扩展”关系。我想这可能会给阅读本文的人带来一个令人困惑的信息,但那只是我。不用担心,谢谢你更新你的答案。:)如果不是继承关系,它们在概念上是相关的,这是对的。也不要将任务堆栈与屏幕上可见的内容混淆。我只是想在这里说清楚。位于任务堆栈顶部并不意味着它在屏幕上可见。因此,一个作为其任务堆栈中唯一活动的单例活动(它可能位于另一个活动(在不同的任务中)的后台)仍然能够处理意图(这样做时,将出现在前台)+1,尽管我想知道是否有比MyApplication.onCreate()更好的选项当每个进程需要初始化一次时。例如,还有什么是w