android基础(Context)
来源:互联网 发布:淘宝助理无销售属性 编辑:程序博客网 时间:2024/06/06 02:44
Android程序不像Java程序一样,随便创建一个类,写个main()方法就能跑了,而是要有一个完整的工程环境,在这个环境下,我们有Activity、Service、BroadcastReceiver等系统组件,而这些组件并不能像一个普通的Java对象new一下就能创建实例,而是要有它们各自的上下文环境,也就是我们这里讨论的Context,可以说,Context是维持Android程序中各组件能够正常工作的一个核心功能类
在绝大多数场景下,Activity、Service和Application这三种类型的Context都是可以通用的,不过有几种场景比较特殊,比如启动Activity,还有弹出Dialog,出于安全原因的考虑,Android是不允许Activity或Dialog凭空出现的,一个Activity的启动必须要建立在另一个Activity的基础之上,也就是以此形成的返回栈。而Dialog则必须在一个Activity上面弹出(除非是System Alert类型的Dialog),因此在这种场景下,我们只能使用Activity类型的Context,否则将会出错
Context数量 = Activity数量 + Service数量 + 1
getApplication()方法是用来获取Application实例的,但是这个方法只有在Activity和Service中才能调用的到,那么也许在绝大多数情况下我们都是在Activity或者Service中使用Application的,但是如果在一些其它的场景,比如BroadcastReceiver中也想获得Application的实例,这时就可以借助getApplicationContext()方法,也就是说,getApplicationContext()方法的作用域会更广一些,任何一个Context的实例,只要调用getApplicationContext()方法都可以拿到我们的Application对象
getBaseContext()方法得到的是一个ContextImpl对象,ContextImpl正是上下文功能的实现类。Application、Activity这样的类其实并不会去具体实现Context的功能,而仅仅是做了一层接口封装而已,Context的具体功能都是由ContextImpl类去完成的
所有ContextWrapper中方法的实现都非常统一,就是调用了mBase对象中对应当前方法名的方法,attachBaseContext()方法,这个方法中传入了一个base参数,并把这个参数赋值给了mBase对象。而attachBaseContext()方法其实是由系统来调用的,它会把ContextImpl对象作为参数传递到attachBaseContext()方法当中,从而赋值给mBase对象,之后ContextWrapper中的所有方法其实都是通过这种委托的机制交由ContextImpl去具体实现的,所以说ContextImpl是上下文功能的实现类是非常准确的
Application中在onCreate()方法里去初始化各种全局的变量数据是一种比较推荐的做法,但是如果你想把初始化的时间点提前到极致,也可以去重写attachBaseContext()方法,但不能在构造方法中调用getPackageName等成员方法
1. public class MyApplication extends Application {
2. private static MyApplication app;
3. public static MyApplication getInstance() {
4. if (app == null) {
5. app = new MyApplication();
6. }
7. return app;
8. }
9. }
这种写法是大错特错,因为我们知道Application是属于系统组件,系统组件的实例是要由系统来去创建的,如果这里我们自己去new一个MyApplication的实例,它就只是一个普通的Java对象而已,而不具备任何Context的能力
1. public class MyApplication extends Application {
2. private static MyApplication app;
3. public static MyApplication getInstance() {
4. return app;
5. }
6. @Override
7. public void onCreate() {
8. super.onCreate();
9. app = this;
10. }
11. }
- android基础(Context)
- 【Android】Context基础
- Android 中 Context介绍(sundy深入浅出)之基础概念
- android Context(未完成)
- Android基础概念Context的作用
- Android基础概念Context的作用
- Android基础概念Context的详解
- Android基础框架之Context详解
- Android基础概念Context的作用
- Android基础概念Context的作用
- android基础--tools:context=".MainActivity"作用
- android基础部分再学习---Context
- android基础--tools:context=".MainActivity"作用
- android基础--tools:context=".MainActivity"作用
- android基础--tools:context=".Activity"作用
- android基础--tools:context=".MainActivity"作用
- android基础--tools:context=".MainActivity"作用
- Android - Context, What Context?
- 树和二叉树(二)
- 一个简单的DDraw应用程序
- c++的指针和引用
- Zabbix_zabbix数据库表各字段说明
- nginx+ffmpge+rtmp实现媒体流的直播
- android基础(Context)
- 无限极分类管理之子属性获取
- 面向对象—多态(3)
- Android之jni调用java函数总结
- 深入理解JavaScript系列(18):面向对象编程之ECMAScript实现(推荐)
- Docker容器和本机之间的文件传输。
- BZOJ 1935: [Shoi2007]Tree 园丁的烦恼
- 用微信/APP给你的 ESP32 配置热点密码
- 惠州学院-数据库实验4-数据库中数据视图的使用