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. }

 

 

0 0
原创粉丝点击