Android Context简单用法

转载请标注:http://blog.csdn.net/friendlychen/article/details/73472419
Android程序员开发时都离不开这个重要的Android知识点,Context。之前也是经常遇到相关问题,然后又回头查相关资料,觉得很是浪费时间,好记性不如烂笔头,于是总结了这篇关于Context的文章。当然其中如有错误,烦请各位大佬批评指正,我也非常乐意接受各位看官的意见和建议的。

一、Context基本概念

Context字面上的意思是上下文,也就是我们使用的场景,这里上一段官方对Context的Class Overview:(http://android.xsoftlab.net/reference/android/content/Context.html,Context源码中也有的。)
Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.
大概意思是:这是一个关于应用程序环境的全局信息接口。这是一个抽象类,实现类(这里指的是ContextIml类)是由系统提供的。允许获取应用级别的资源和类,也可以调用应用级别的操作,比如启动Activity,broadcast,接受intent等等。
从Context的子类结构中也可以可以看出,Activity,Application,Service,TabActivity等都是它的直接或者间接子类。这足以看出Context的重要性了。

二、Context的用法

对应Context中的用法,最多的应该是得到当前的上下文了,怎么获取到Context呢,比如Activity.this,getContext,getActivity,还有getApplicationContext了。其中Activity.this是获取到Activity中的Context,getContext和getActivity是Fragment中使用的,最终返回的还是Activity中的Context,而getApplicationContext返回的是Application中的Context,我们知道application的生命周期一般是比Activity生命周期长,为了防止可能会产生的内存泄露,能用application的尽量用它,否则用Activity。那么实际应用场景怎么区别使用呢
在Dialog和Activity跳转中使用Activity中的Cotenxt,在Dialog中构造方法中传入Activity.this, 因为我们知道Dialog其实是依附在Activity中的,当Activity销毁时,Dialog存在就么有意义了,因此这里只能传入当前Activity.this。当然我们使用自定义Dialog时,可能会遇到can not start a load for a destroy activityde 的非法参数异常,一般是因为其宿主(也就是当前Activity)销毁了,这个动作无法执行啦。简单来说就是你工具都没了,你怎么工作?因此呢可以加上这代码:

    /**
     * 判断parent view是否还存在
     * 若不存在不能调用dismis,或setDialog等方法
     * @return
     */
    private static boolean isContextValid() {
        if (context == null)
            return false;
        if (context instanceof Activity) {
            Activity act = (Activity) context;
            if (act.isFinishing())
                return false;
        }
        return true;
    }

判断下当前context是否合法。也就是当前Activity存不存在了。
而同样道理,Activity跳转当然也是从A Activity跳转到B Activity,用application怎么适合呢?两个Activity都在application内,如果用application系统怎么知道到底A到B还是B到A呢?
当然还有layout inflate这个其实也用的是Activity类中的Context。
这里贴出一张图,是有人总结出的Context的不同使用场景:
Android Context简单用法_第1张图片

这个表格是一目了然啦。大家可以看看。
Context作为上下文呢,还能够获取应用上的资源,就像上面Context概念上说的。getResource方法返回一个Resource资源对象,由这个Resource对象获取到相应资源,比如res中的一些资源。getAssets方法返回一个AssetManager资产管理器,可以获取到assets资产目录中的内容。getPackageManager方法获取到包管理器,这里有好多包相关信息。getMainLooper可以获取到主线程的Looper对象等等。这里就贴出部分Context的源码。有兴趣可以去看看。

    public abstract AssetManager getAssets();
    public abstract Resources getResources();
    public abstract PackageManager getPackageManager();
    public abstract Looper getMainLooper();

这里作了一个简单的总结,希望对大家有帮助,以后再使用Context时想想什么情况下使用。当然有什么不对的,希望大家多多批评指正哈。

你可能感兴趣的:(Android)