Android 编程技巧之 ----- 获取全局 Context 对象


Context,在安卓中译为上下文,一般作为很多函数的参数传递,熟知的Activity 就是继承自Context 的对象 (Context最终也是继承自Object),所以我们在Activity 间跳转的时候调用 startActivity()方法时第一个参数可以直接把 Activity的对象传递进去。

在一般简单的软件逻辑中,我们使用Activity、Service、receiver等四大组件时,是可以直接拿到该 Context对象参数的,但是当我们的逻辑越来越复杂,代码量越来越多的时候,就会发现有时候我们希望直接使用到 Context对象参数来实现需要的功能时,却没法轻松得到,这是很困扰人的。

程序员的思路是很重要的,一旦被打断,可能需要花很多时间才能找回来,而因为一个小小的Toast 需要用到 Context对象参数打断思路,未免得不偿失。


这里用一个特例来说明,我们知道,一个应用如果需要经常访问网络获取自己需要的资源时,不应该重复造轮子,而是单独写一个类,把关于网络访问获取资源的代码写在一个公共静态函数中,这样任何时候需要访问网络时就方便多了。

但是如果我们想在检测到没网络时弹出一个 Toast,这时候就需要一个 Context上下文对象了,当然可以在网络访问的函数参数中增加一个 Context对象参数, 但是这样等于把这个任务丢给了调用的人,如果想要自己解决呢?


事实上,安卓应用每次启动都会初始化一个默认的Application 类 (先于各组件初始化),而我们想要获取一个全局的 Context对象也可以从这里下手:

public class ApplicationContext extends Application {
    private static Context context;

    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
    }

    public static Context getContext() {
        return context;
    }
}

我们新建一个类继承自 Application 类,并定义一个Context 对象引用,然后重写onCreate()方法,调用getApplicationContext() 方法可以得到应用级别的 Context对象,再把context 对象引用指向该方法调用的结果,最后写一个公共静态的函数用于得到该context,这样我们可以通过类名.getContext()方法来得到应用级别的Context对象。以后在任何需要用到Context 的地方,只需要调用 ApplicationContext.getContext()就可以传入参数了,是不是挺方便的?

网络访问代码简单贴下,其他用法类似,可以自行写用例试验结果。

public static void sendRequest(String address) {
        if (!TextUtils.isEmpty(address)) {
            HttpURLConnection connection = null;
            try {
                URL url = new URL(address);
                connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");
                connection.setConnectTimeout(8000);
                connection.setReadTimeout(8000);
                InputStream in = connection.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                StringBuilder builder = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    builder.append(line);
                }

                Log.d("HTTPCallBack", builder.toString());

                if (!isNetWorkAvailable()) {
                    Toast.makeText(ApplicationContext.getContext(), "Network Unavailable", Toast.LENGTH_SHORT).show();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                if (connection != null) {
                    connection.disconnect();
                }
            }
        }

    }

    private static boolean isNetWorkAvailable()
    {
        ...
    }



篇幅短小,仅供参考,谢谢阅读!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值