Android中,Context,啥是Context

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android中,Context,啥是Context相关的知识,希望对你有一定的参考价值。

  Context可能是Android应用中最常用的元素,而它也可能是最容易误用的。

  Context对象是如此常见和传递使用,它可能会很容易产生并不是你预期的情形。加载资源、启动一个新的Activity、获取系统服务、获取内部文件路径以及创建view(其实还远不止这些)统统都需要Context对象来完成。我(原文作者)想做的只是给大家提供一些Context是如何工作的见解,以及让大家在应用中更有效的使用Context的技巧。

  Context的类型

  并不是所有的context实例都是等价的。根据Android应用的组件不同,你访问的context推向有些细微的差别。

  Application - 是一个运行在你的应用进程中的单例。在Activity或者Service中,它可以通过getApplication()函数获得,或者人和继承于context的对象中,通过getApplicationContext()方法获得。不管你是通过何种方法在哪里获得的,在一个进程内,你总是获得到同一个实例。

  Activity/Service - 继承于ContextWrapper,它实现了与context同样API,但是代理这些方法调用到内部隐藏的Context实例,即我们所知道的基础context。任何时候当系统创建一个新的Activity或者Service实例的时候,它也创建一个新的ContextImpl实例来做所有的繁重的工作。每一个Activity和Service以及其对应的基础context,对每个实例来说都是唯一的。

  BroadcastReciver - 它本身不是context,也没有context在它里面,但是每当一个新的广播到达的时候,框架都传递一个context对象到onReceive()。这个context是一个ReceiverRestrictedContext实例,它有两个主要函数被禁掉:registerReceiver()和bindService()。这两个函数在BroadcastReceiver.onReceive()不允许调用。每次Receiver处理一个广播,传递进来的context都是一个新的实例。

  ContentProvider - 它本身也不是一个Context,但是它可以通过getContext()函数给你一个Context对象。如果ContentProvider是在调用者的的本地(例如,在同一个应用进程),getContext()将返回的是Application单例。然而,如果调用这和ContentProvider在不同的进程的时候,它将返回一个新创建的实例代表这个Provider所运行的包。

  保存引用

  第一个我们需要解决问题是,在一个对象或者类内部保存一个context引用,而它生命周期却超过其保存引用的对象的生命周期。例如,创建一个自定义的单例,它需要一个context来加载资源或者获取ContentProvider,从而保存一个指向当前Activiy或者Service的引用在单例中。
参考技术A 1、它描述的是一个应用程序环境的信息,即上下文。
2、该类是一个抽象(abstract class)类,Android提供了该抽象类的具体实现类。
3、通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个Activity,发送广播,接受Intent
信息 等。
参考技术B 文本文件。。。。。。 参考技术C 上下文对象.

模板中的 django 请求

【中文标题】模板中的 django 请求【英文标题】:django request in template 【发布时间】:2010-10-16 16:47:07 【问题描述】:

我已启用 django 请求处理器

TEMPLATE_PROCESSORS = (
"django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.request",
)

我仍然不必请求模板中可用的变量。 我必须手动传递它。使用 django 1.0.2 网络上的任何地方似乎都只是关于启用的请求处理器..

我也将 RequestContext 用作:

 return render_to_response(
    'profile.html',
    
        'persons':Person.objects.all(),
        'person':Person.objects.get(id=id),
         'request':request,
    ,
    context_instance=RequestContext(request)
)

运气不好

天啊 它的新名称是 TEMPLATE_CONTEXT_PROCESSORS

【问题讨论】:

为什么要让模板知道有关请求的任何信息? easy : 我需要知道动态导航请求的路径 URL。我完成了它现在可以工作了。 【参考方案1】:

settings.py:

TEMPLATE_CONTEXT_PROCESSORS = (
  # ...
  'django.core.context_processors.request',
  # ...
)

【讨论】:

感谢 Dingo,我在这里找到了教程 wiki.workassis.com/django-accessing-request-object-in-template 在更高版本的 Djano 中,改用:'django.template.context_processors.request'【参考方案2】:

TEMPLATE_CONTEXT_PROCESSORS 代替 TEMPLATE_PROCESSORS

【讨论】:

感谢您编辑原始问题,尽管进一步的更新使this answer 对settings.py 中的内容更加准确。【参考方案3】:

请注意,从 Django 1.8 开始,这已更改为“模板”设置,并且在默认配置中,不包括请求处理器。

TEMPLATES = [

    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [
        # insert your TEMPLATE_DIRS here
    ],
    'APP_DIRS': True,
    'OPTIONS': 
        'context_processors': [
            # Insert your TEMPLATE_CONTEXT_PROCESSORS here or use this
            # list if you haven't customized them:
            'django.contrib.auth.context_processors.auth',
            'django.template.context_processors.debug',
            'django.template.context_processors.i18n',
            'django.template.context_processors.media',
            'django.template.context_processors.static',
            'django.template.context_processors.tz',
            'django.contrib.messages.context_processors.messages',
        ],
    ,
,]

只需重新添加请求处理器即可解决问题:

'django.core.context_processors.request',

有关详细信息,请参阅Django Upgrading Docs。

【讨论】:

你确定它在 1.8 中默认是关闭的吗? github.com/django/django/blob/1.8.6/django/conf/… 我刚刚用 django-admin startproject 在 1.9.6 上进行了测试,它也在那里 github.com/django/django/blob/1.9.6/django/conf/…【参考方案4】:

您确定没有可用于模板的request 变量吗?删除线后会发生什么

'request':request,

这与该行存在时不同。如果您的模板加载方式相同,则问题出在您的模板上。

【讨论】:

对我来说,处理请求和更新上下文的函数在没有请求的情况下传递了上下文。请求丢失了,所以必须先手动将其传递给函数,因为与 render() 不同,传递请求也不聪明。与此答案有些相关。【参考方案5】:

MIDDLEWARE_CLASSES=( ... 'yourfolder.yourfile.yourclass', ... 你的班级:

类 AddRequestToTemplate: process_templaet_response(自我,请求,响应): response.context_data['request']=request

【讨论】:

以上是关于Android中,Context,啥是Context的主要内容,如果未能解决你的问题,请参考以下文章

对于android里面的content不理解,查找说这个是上下文,但是我还是没有这个概念,啥是上下文求大神讲解

启动服务器 SEVERE: Error configuring application listener of class org.springframework.web.context.Contex

Android 如何实现竖排文字显示

android怎么保证notification不重复

伴随对象 - Android 是不是希望将它们注册为活动 (?)

如何使用MAT分析Android应用内存泄露