2016-12-04 87 views
3

尽管具有不同的活动工作,并开始他们的结果我没有选择,只能使用意图。现在意图需要上下文,这对我来说毫无意义。我知道这种情况下允许访问的应用程序资源,但为什么意图需要上下文?

为什么你需要了解应用程序资源时的意图仅仅是一个简单的使者?

另外,我不太确定为什么有些人创建与getApplicationContext()而其他使用此为活动场景意图????

最后,我不确定在调用startActivityResult()的活动时,如果我不通过上下文的“this”而是应用程序上下文,方法onActivityResult()上的回调会得到回调。我认为你必须使用“this”或在当前活动环境中传递startActivityResult()以获得回叫。这只是直接了当的Java吧?如果你在一个类中,然后通过其他活动类将有你的类的引用,从而允许它来调用你的类,这是onActivityForResult()的方法。但是,情况并非如此,所以我错过了什么?

回答

4

Intent本身并不需要Context。构造函数Intent#Intent(Context, Class)只是一个方便的构造方法,它在内部使用提供的参数来派生ComponentNameComponentName反过来只是您的应用的包名称和目标类名。所以ComponentName可能是这样的:

com.foo.bar/com.foo.bar.ui.activity.MyActivity 

但是,您可以也只是用一个空的构造Intent#Intent()并提供ComponentName自己(Intent#setComponentName(ComponentName))。

因此,如果您提供应用程序或您的活动的上下文(后者只是输入更简单),则无关紧要。同时请记住,需要应用程序上下文的类可以自己调用Context#getApplicationContext,所以这不是您需要担心的问题。

关于startActivityForResult() - Android在内部管理您的活动记录堆栈。因此它将结果传递给堆栈中的前一个活动。当您点击“返回”时,它也知道返回的位置。

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

+0

您好,您的回答非常简洁明了。不过,我只想快速澄清一下。所以,无论何时我开始一个活动,调用startActivity()的活动都将在堆栈中正确注册?那么,如果我没有特别通过该活动,那么android如何知道引用该活动并将其注册到堆栈中。 – Wowzer

+0

系统知道哪个活动位于堆栈顶部(您的活动)。当你开始一个新的时候,它使用一个组件名来标识它。即使您使用隐式意图(其中一个使用操作而不是明确的目标名称),它最终也会解析为特定的组件名称。 –

0

没有受到太大深入到Android开发但还是让我试着解释。所以基本上,上下文是将您的资源链接到您的程序的参考。每个对象都有自己的上下文,其中包含设置该对象所需的资源。除了其他目的之外,还需要创建许多对象并获取程序标识信息。这对建立新的视图和活动非常重要,但它也可以用于其他目的。有关更多信息,请参阅此Android Context。按照 Activity inherits context。因此,如果你在一个活动中,你只需要传递自己的使用上下文。它还包含一个指向getBaseContext()的指针。如果您需要整个应用程序上下文,您可能偶尔需要引用该内容,但很可能您暂时不会。

有些方法可以创建一个不需要上下文的Intent。但是,如果您想要定位特定包的特定类别,那么为目标包提供上下文是现成的方法。请参阅此Context Lesson

正如他在answergetApplicationContext() offers application context中的snctin所解释的那样。基本上,应用程序上下文与应用程序相关联,并且在应用程序的整个生命周期中始终保持不变。另请参阅this post

Android - How to start (display) a new Activity。根据它

startActivity(new Intent(this, ProjectsActivity.class));

假定当前类扩展了Android活动类之一,它给你访问到startActivity方法。根据Getting result from a activity,启动另一个活动不必是单向的。您也可以开始另一项活动并返回结果。要接收结果,请调用startActivityForResult()(而不是startActivity())。

例如,您的应用程序可以启动相机应用程序并接收拍摄的照片。或者,您可能会启动People应用以便用户选择联系人,并且您将收到联系详细信息。这post将帮助你了解更好的方式。

希望有所帮助。同时也感谢因为你的问题,我用Android进行了刷新。:)

0

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

而且,我相信你想询问关于startActivityForResult()。 Android本身就像处理其他回调一样处理回调。您可以参考活动生命周期的示例。每当它开始onCreate(), onStart(), onResume()都由Android自己调用。

+0

我不认为上下文用于理解应用程序中发生了什么,因为当您启动新的活动时,android只会将该上下文默认设置为该新活动,因为所有活动都从提供的相同应用程序上下文继承该活动在应用程序内 – Wowzer

+0

Android不会将自己的应用程序上下文赋予新的活动。使用getAplicationContext()和使用它有一个区别b/w。 Android将提供上下文,无论您将声明它给。参考问题1026973 – hittsss