Android意图上下文混淆
有人可以向我解释这一点:
Intent intent = new Intent(Context, AlarmReceiver.class);
我从来没有理解,我认真地认为,如果有人不尝试深入解释这一点,我永远不会。 这整个上下文对我来说是如此混乱。 有时它的工作原理如下:
Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
有时它不会那样工作,但它只接受:
Intent intent = new Intent(context, AlarmReceiver.class);
有时它的:
Intent intent = new Intent(this, AlarmReceiver.class);
等等等等等等。
我了解上下文的基本知识,但有多less? 为什么日食会给我一次错误,而又一次罚款呢? 为什么我们有时需要申报上下文? :
Context context;
我无法find适合所有情况的正确环境,我怎么知道在任何情况下都是正确的?
首先,让我解释一下情况会好一点,然后让我们继续讨论如何使用和接收。 本质上讲,上下文是将资源链接到程序的参考。 每个对象都有自己的上下文,其中包含设置该对象所需的资源。 除了其他目的外,还需要创build许多对象,并获取程序标识信息。 这使得build立新的观点和活动非常宝贵,但也可以用于其他目的。 有关更多信息,另请参阅此答案 。
一个项目的上下文可以来自不同的地方。 有时它被存储并且必须被检索,有时它被inheritance。 基本上,这是面向对象编程。
只是给你几个例子:
活动inheritance上下文。 因此,如果你在一个活动中,你只需要传递自己的使用上下文。 它还包含一个指向getBaseContext()
的指针。 如果您需要整个应用程序上下文,您可能偶尔需要引用它,但最有可能的是您不会有一段时间。
视图不会inheritance上下文。 但是,它有一个方法getContext() 。 如果您需要从视图中获取上下文,则可以通过这种方式来获取它。 这个上下文不会是完整的,但只会有View的内容的上下文。
片段也不会inheritance上下文。 它们包含一个getActivity()方法,如果Fragment处于活动状态,将返回活动,这是Fragment的上下文。
BroadcastReceivers也不会inheritance上下文。 事实上,它们根本不包含上下文,只是在接收到事件时接收当前上下文(如onReceive(Context context,Intent intent) )
我通过上下文来理解的是环境。简而言之,上下文就是任何事情的环境。所以当你使用任何forms的上下文时,你必须决定你正在使用上下文的事物的周围环境。
例如,如果您希望某些数据或字段保留在应用程序中,则应该在应用程序类中定义它。
现在,当您在应用程序的任何组件中获得应用程序上下文时,您在应用程序类中声明的这个字段将位于您的上下文中。因此您可以访问它。
对于所有上下文types也是如此。
如果你尝试在服务组件中使用alertDialog,通过使用上下文“this”。试试这个,我敢打赌,你一定会得到exception,因为“this”代表服务的环境在使用它的时候。因为它是背景组件,因为它会告诉你坏的标记exception。这意味着为周围的视图生成的标记不适合alertDialog显示。
希望这给你简要的想法你想要的。
上下文function
您可以安全地使用给定的上下文对象的常见操作取决于它最初来自哪里。 下面是一个应用程序将收到一个上下文的常见的地方的表格,在每种情况下,它是有用的:
- 一个应用程序可以从这里启动一个Activity,但是它需要创build一个新的任务。 这可能适合特定的用例,但可以在应用程序中创build非标准的后退堆栈行为,通常不被推荐或被认为是良好的做法。
- 这是合法的,但通货膨胀将与您正在运行的系统的默认主题完成,而不是在您的应用程序中定义的。
- 如果在Android 4.2及更高版本上,接收器为空(用于获取粘性广播的当前值),则允许。
原文在这里 。