在编写某些自定义类时,无法方便的取得Context(Activity或Application),例如需要获取res资源,取些drawable或string之类的,通常会比较麻烦。

解决方法一般有:

1、传入Context(例如Toast)

2、继承Application使用单例(此法在编写应用无关的工具类时无法很好的解决问题)

一般来说,能使用Activity尽量不用Application作为Context,官方文档(This generally should only be used if you need a Context whose lifecycle is separate from the current context, that is tied to the lifetime of the process rather than the current component.)

但在获取资源文件时通常并无大碍,因此笔者特别为能够在任意位置获取应用Context做了一番研究。

在上述方法2中虽有缺陷,但经过一番改造仍不失为一个不错的解决方法。

首先我们构造一个存储Context的类ContextHolder,在Application初始化时将Application传入ContextHolder,这个方法在很多第三方库都能见到类似的处理。

public class ContextHolder {

static Context ApplicationContext;

public static void initial(Context context) {

ApplicationContext = context;

}

public static Context getContext() {

return ApplicationContext;

}

}

public class App extends Application {

@Override

public void onCreate() {

super.onCreate();

ContextHolder.initial(this);

}

}

这样我们就能在任意位置调用ContextHolder.getContext()来获取应用Context。

那么有没有可能不需要任何初始化操作就能完成这个需求呢?笔者做了一些尝试。

由于实际上获取应用Context也就是获取当前应用实例,经笔者研究下面2种方法都可以通过反射直接获取当前应用。

try {

Application application = (Application) Class.forName("android.app.ActivityThread").getMethod("currentApplication").invoke(null, (Object[]) null);

}

catch (Exception e) {

e.printStackTrace();

}

try {

Application application = (Application) Class.forName("android.app.AppGlobals").getMethod("getInitialApplication").invoke(null, (Object[]) null);

}

catch (Exception e) {

e.printStackTrace();

}

经测试,即使应用处于后台仍能正确获取到调用此方法的Application。

任意的android程序,Android任意位置获取应用Context相关推荐

  1. android查找邮件程序,Android 程序崩溃日志邮件获取

    版权声明:本文为博主原创文章,未经博主允许不得转载. 在我们开发Android应用程序的时候,BUG的出现是难以避免的,时不时还会出现崩溃的情况,这个时候,我们急需知道造成问题的原因是什么,但是,在没 ...

  2. 时间计时android程序,Android 时间计时器控件 Chronometer

    当你想要显示时间的推移而不是进程的增加的时候,可以使用Chronometer作为一个计时器.当需要记录用户进行某项操作所消耗的时间的时候,或者在游戏中需要限制时间时候,它将非常实用. 这里,Chron ...

  3. 独数游戏android程序,Android 数独小游戏

    先看看效果图 sudoku-o3.gif 数独设计思路 先看布局,我们可以看到数独由9x9的格子组成,每个格子中间有一个数字. Cell (单个格子.android 中我们可以先用TextView代替 ...

  4. Android程序如何实现从网络中获取一张图片

    在学习黎活明的Android视频的时候,有一讲是说怎么从网络中获取图片.这里,我就做一个笔记和总结吧. 首先,我们要知道图片这种文件,不能以我们印象中那些基本数据类型来定义或是以这些类型从网络中获取图 ...

  5. android surfaceview 大小,Android设置SurfaceView任意大小、任意位置、保持预览宽高比与屏...

    Android设置SurfaceView任意大小.任意位置.保持预览宽高比与屏 Android设置SurfaceView任意大小.任意位置.保持预览宽高比与屏显一致 一.任意大小.任意位置 1) 代码 ...

  6. Android 高德地图 自己位置的显示与点地图上任意一点的坐标

    一些简单的基本配置在这里就不做介绍 效果图片如下: 1. 中间的蓝点是自己的位置 2.黄色的图标是点击的位置 3.上面TextView显示的是黄色图片的坐标 下面是代码: MainActivity p ...

  7. 为任意屏幕尺寸构建 Android 界面

    /   今日科技快讯   / 北京时间2022年1月17日,我国在太原卫星发射中心用长征二号丁运载火箭,成功将试验十三号卫星发射升空,卫星顺利进入预定轨道,发射任务获得圆满成功. /   前言   / ...

  8. Android 打开 GPS 导航并获取位置信息

    原文地址为: Android 打开 GPS 导航并获取位置信息 最近在做一个 Android 项目,需要用到GPS获取位置信息,从 API 查了一下,发现获取位置信息仅需极其简单的一句即可: getL ...

  9. Android GPS应用:动态获取位置信息

    随时随地技术实战干货,获取项目源码.学习资料,请关注源代码社区公众号(ydmsq666) 在上文中,介绍了GPS概念及Android开发GPS应用涉及到的常用类和方法.在本文中,开发一个小应用,实时获 ...

最新文章

  1. J-Link驱动下载和JLINK下载Hex程序
  2. 四十、Java中字节流和字符流介绍和区别
  3. linux socket资源耗尽,TCP的socket资源被耗尽的问题
  4. 戴尔游匣7559经常(大概半小时)断电,关机的解决办法
  5. SQL优化老出错,那是你没弄明白MySQL解释计划
  6. java 正则判断二进制_用正则表达式判断一个二进制数是否能被3整除
  7. 项目解析jsx文件_React系列二十二 云音乐项目实战
  8. Could not create ServerSocket on address 0.0.0.0/0.0.0.0:9083
  9. [博应用官网]iTunes备份密码忘记了该如何解决?
  10. 查看linux系统语言并修改
  11. 深入浅出的理解频谱泄露
  12. T-POT蜜罐平台 20.06 搭建
  13. 英语常见的固定搭配有哪些
  14. Python Day19
  15. 工程学导论的学习感悟
  16. Java面试题---第四阶段
  17. html内容整体放大缩小,html元素放大缩小的示例-javaScript示例
  18. linux 快速启动应用程序(alias使用)
  19. 【控制系统数字仿真与CAD——实验报告】实验四:黄金分割法最优化PI调节器参数(文末附完整代码 + 实验结果)
  20. 智能优化算法——哈里斯鹰算法(Matlab代码实现)

热门文章

  1. C# 删除文件错误 access denied
  2. OSChina 周一乱弹 —— 还一星期就要和女神约会了
  3. LiveData + ViewModel + Room (Google 官文)+Demo
  4. 现有exe转为服务_方式01
  5. JavaScript 中 void(0) 的含义
  6. jsp内置对象page
  7. springmvc进阶(5):mvc:default-servlet-handler详解
  8. 修改sqlarchemy源码使其支持jdbc连接mysql
  9. HTML5——FileReader详解
  10. 超强、超详细Redis数据库入门教程