Java 为什么意图需要语境?

Java 为什么意图需要语境?,java,android,Java,Android,当处理不同的活动并开始它们以获得结果时,我别无选择,只能使用intent。现在意图需要语境,这对我来说毫无意义。我知道上下文允许访问应用程序资源,但是 当意图只是一个简单的信使时,为什么您需要了解应用程序资源 另外,我不太清楚为什么有些人使用getApplicationContext()创建意图,而其他人则将其用于活动上下文 最后,我不太确定调用startActivityResult()的活动在我没有为上下文传递“this”,而是为应用程序上下文传递“this”时,如何接收对方法onActivi

当处理不同的活动并开始它们以获得结果时,我别无选择,只能使用intent。现在意图需要语境,这对我来说毫无意义。我知道上下文允许访问应用程序资源,但是

当意图只是一个简单的信使时,为什么您需要了解应用程序资源

另外,我不太清楚为什么有些人使用
getApplicationContext()
创建意图,而其他人则将其用于活动上下文


最后,我不太确定调用
startActivityResult()
的活动在我没有为上下文传递“this”,而是为应用程序上下文传递“this”时,如何接收对方法
onActivityResult()
的回调。我认为您必须在当前活动上下文中使用“this”或passing,该上下文称为
startActivityResult()
,以便接收回调。这就是直接的java,对吗?如果传入一个类,那么另一个activity类将引用您的类,从而允许它调用类中的方法,即
onActivityForResult(
)。然而,事实并非如此,那么我还缺少什么呢?

虽然没有深入研究Android开发,但还是让我尝试解释一下。因此,基本上,上下文是将资源链接到程序的参考。每个对象都有自己的上下文,其中包含设置该对象所需的资源。除其他目的外,需要创建许多对象,并获取程序标识信息。这使得建立新的视图和活动非常宝贵,但也可以用于其他目的。有关更多信息,请参见此

根据此
活动继承上下文。因此,如果您在一个活动中,您只需要传递它自己来使用上下文。它还包含一个指向getBaseContext()的指针。如果需要整个应用程序上下文,您可能偶尔需要引用它,但很可能暂时不会

有一些创建意图的方法不需要上下文。但是,如果您想要针对特定包的特定类,那么为目标包提供上下文是一种现成的方法。参考这个

正如snctin在他的
getApplicationContext()中所解释的,它提供了应用程序上下文。基本上,应用程序上下文与应用程序关联,并且在应用程序的整个生命周期中始终相同。另请参阅

看。根据它

startActivity(新意图(这个,ProjectsActivity.class))

假设您当前的类扩展了一个Android活动类,该类允许您访问startActivity方法

根据他的观点,开始另一项活动不一定是单向的。您还可以启动另一个活动并收到结果。要接收结果,请调用startActivityForResult()(而不是startActivity())

例如,您的应用程序可以启动照相机应用程序,并因此接收捕获的照片。或者,您可以启动People应用程序,以便用户选择联系人,您将收到联系人详细信息。这将帮助你更好地理解同样的问题


希望有帮助。同样感谢您的提问,我对Android进行了更新。

Intent
本身不需要
上下文。构造函数
Intent#Intent(Context,Class)
只是一个方便的构造函数,它在内部使用提供的参数来派生
组件名
ComponentName
反过来只是应用程序的包名和目标的类名。因此,
ComponentName
可能类似于:

com.foo.bar/com.foo.bar.ui.activity.MyActivity
但是,您也可以只使用空构造函数
Intent#Intent()
并自己提供
ComponentName
Intent#setComponentName(ComponentName)

因此,无论是提供应用程序的上下文还是活动的上下文都无关紧要(后者的输入更简单)。还请记住,需要应用程序上下文的类可以自己调用
context#getApplicationContext
,因此您不必担心这一点

关于
startActivityForResult()
-Android在内部管理一堆活动记录。因此,它将结果传递给堆栈上的上一个活动。当您单击“后退”时,它知道返回到哪里的方式也是一样的


请注意,这并不意味着它维护活动实例的堆栈。这些实例可能早就消失了-销毁并收集垃圾以释放内存。但是,堆栈包含允许重新创建和恢复其状态的信息。

Intent
本身不需要
上下文,但正如您自己指出的那样,
Intent
只是一个信使。它还将应用程序/对象的当前状态传递给新创建的对象,以便它能够理解应用程序中到底发生了什么。这就是为什么我们需要传递上下文


而且,我相信您想询问关于
startActivityForResult()
。Android本身处理回调的方式与处理其他回调的方式相同。您可以以活动生命周期为例。无论何时启动,Android都会将其称为
onCreate()、onStart()、onResume()

您好,您的答案非常清晰简洁。不过,我只想快速澄清一下。因此,每当我启动一个活动时,调用startActivity()的活动都会在堆栈中注册,对吗?那么,当我没有特别传入该活动时,android如何知道引用该活动并将其注册到堆栈中呢。当您启动一个新组件时,它会使用组件名称来标识它