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()
{
...
}
篇幅短小,仅供参考,谢谢阅读!