Android - Context, What Context?

本文深入探讨了Android中Context的重要性及其各种类型,包括Application、Activity/Service、BroadcastReceiver和ContentProvider等。文章强调了如何正确地使用Context,特别是如何避免内存泄漏的问题。

Context可能是Android应用程序中最重要的元素,也可能最容易被滥用

Context 对象是很常见的,并且使用非常频繁,它能很容易的造成这样的局面。加载资源,显示一个新Activity,获得一个系统服务,获得内部文件路径,创建视图都需要一个  Context 来完成这些任务,我想做的是提供一些见解来讲解使用Context的一些技巧,让你更有效的利用在你的应用程序中。

Context 类型
并非所有Context对象生来平等,根据Android应用程序组件,你访问Context稍有不同:

Application - 是你应用程序运行过程中的一个单例,它可以通过 getApplication() 从Activity或者Service中获得, getApplicationContext() 可以从所有继承Context的对象中获得。不管在哪个方法获得,你都是得到的一个相同的实例。

Activity/Service - 继承 ContextWrapper实现其相同的API,但是代理中的所有方法调用了一个隐藏的内部Context对象,也被称为base context。每当framework创建一个新Activity或者Service实例时, 它也创建一个新ContextImpl的实例来将 组件 包裹 。每个Activity或Service,对于 base contex ,是唯一的实例。

BroadcastReceiver -  本身不是一个Context对象,但是framework通过context对象在onReceive()中,每次new broadcast会被传进来。这个实例是一个 ReceiverRestrictedContext 有两个主要的功能被禁用 调用 registerReceiver() 和 bindService(),这两个函数不允许出现在BroadcastReceiver.onReceive()内。每次一个接收的广播进行处理,传递给它的  Context 是一个新实例。

ContentProvider - 也没有Context对象, 而是给出一个创建时通过的getContext()可以访问。如果ContentProvider的运行本地主叫方(即相同的应用程序),那么这将实际上返回相同的应用程序的单身。但是,如果两者是在单独的进程,这将是一个新创建的实例,表示包提供程序正在运行。

保存参考
第一个问题 我们需要保存一个Context对象或者类的一个生命周期中你需要保存。例如,创建一个自定义的单体,需要一个Context对象来加载资源或者访问一个 ContentProvider, 当前的活动或服务 在这个单体保存参考。
坏的单体:
public class CustomManager {
    private static CustomManager sInstance;
    public static CustomManager getInstance(Context context) {
        if (sInstance == null) {
            sInstance = new CustomManager(context);
        }
        return sInstance;
    }
    private Context mContext;
    private CustomManager(Context context) {
        mContext = context;
    }
}
这个问题是,我们不知道Context来自哪儿,它不是一个安全的持有对象的引用,如果它结束了一个Activity或Service,这是一个问题,因为一个单身的管理由一个单一的封闭类内的静态引用。这意味着,我们的对象,它引用的所有其它对象,将永远不会被垃圾收集。如果这方面的活动,我们将有效地保持人质在内存中所有的意见和与它相关的其他潜在的大对象;创建泄漏。
为了防止这一点,我们修改的单身始终引用  Application Context :
好的单体:
public class CustomManager {
    private static CustomManager sInstance;
    public static CustomManager getInstance(Context context) {
        if (sInstance == null) {
            //Always pass in the Application Context
            sInstance = new CustomManager( context.getApplicationContext());
        }
        return sInstance;
    }
    private Context mContext;
    private CustomManager(Context context) {
        mContext = context;
    }
}
现在,context来自哪儿并不重要了,我们持有的对象是安全的,application context 是单例的,所以我们不会

那么,为什么我们不能永远只是引用应用程序上下文?并且永远不必担心有关创建泄漏?答案,因为我躲避在引进,是因为一个上下文是不等于另一个。








内容概要:本文围绕EKF SLAM(扩展卡尔曼滤波同步定位与地图构建)的性能展开多项对比实验研究,重点分析在稀疏与稠密landmark环境下、预测与更新步骤同时进行与非同时进行的情况下的系统性能差异,并进一步探讨EKF SLAM在有色噪声干扰下的鲁棒性表现。实验考虑了不确定性因素的影响,旨在评估不同条件下算法的定位精度与地图构建质量,为实际应用中EKF SLAM的优化提供依据。文档还提及多智能体系统在遭受DoS攻击下的弹性控制研究,但核心内容聚焦于SLAM算法的性能测试与分析。; 适合人群:具备一定机器人学、状态估计或自动驾驶基础知识的科研人员及工程技术人员,尤其是从事SLAM算法研究或应用开发的硕士、博士研究生和相关领域研发人员。; 使用场景及目标:①用于比较EKF SLAM在不同landmark密度下的性能表现;②分析预测与更新机制同步与否对滤波器稳定性与精度的影响;③评估系统在有色噪声等非理想观测条件下的适应能力,提升实际部署中的可靠性。; 阅读建议:建议结合MATLAB仿真代码进行实验复现,重点关注状态协方差传播、观测更新频率与噪声模型设置等关键环节,深入理解EKF SLAM在复杂环境下的行为特性。稀疏 landmark 与稠密 landmark 下 EKF SLAM 性能对比实验,预测更新同时进行与非同时进行对比 EKF SLAM 性能对比实验,EKF SLAM 在有色噪声下性能实验
内容概要:本文围绕“基于主从博弈的售电商多元零售套餐设计与多级市场购电策略”展开,结合Matlab代码实现,提出了一种适用于电力市场化环境下的售电商优化决策模型。该模型采用主从博弈(Stackelberg Game)理论构建售电商与用户之间的互动关系,售电商作为领导者制定电价套餐策略,用户作为跟随者响应电价并调整用电行为。同时,模型综合考虑售电商在多级电力市场(如日前市场、实时市场)中的【顶级EI复现】基于主从博弈的售电商多元零售套餐设计与多级市场购电策略(Matlab代码实现)购电组合优化,兼顾成本最小化与收益最大化,并引入不确定性因素(如负荷波动、可再生能源出力变化)进行鲁棒或随机优化处理。文中提供了完整的Matlab仿真代码,涵盖博弈建模、优化求解(可能结合YALMIP+CPLEX/Gurobi等工具)、结果可视化等环节,具有较强的可复现性和工程应用价值。; 适合人群:具备一定电力系统基础知识、博弈论初步认知和Matlab编程能力的研究生、科研人员及电力市场从业人员,尤其适合从事电力市场运营、需求响应、售电策略研究的相关人员。; 使用场景及目标:① 掌握主从博弈在电力市场中的建模方法;② 学习售电商如何设计差异化零售套餐以引导用户用电行为;③ 实现多级市场购电成本与风险的协同优化;④ 借助Matlab代码快速复现顶级EI期刊论文成果,支撑科研项目或实际系统开发。; 阅读建议:建议读者结合提供的网盘资源下载完整代码与案例数据,按照文档目录顺序逐步学习,重点关注博弈模型的数学表达与Matlab实现逻辑,同时尝试对目标函数或约束条件进行扩展改进,以深化理解并提升科研创新能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值