大家好,今天给大家分享一下Android里的Context的一些用法,以前经常有人在群里问我比如我在一个工具类里的某个方法,或者View里需要调用Context.但是工具类还有View里没有这个上下文怎么办?为了解决大家的疑问,为了解决大家的疑问,我今天写一个简单的Demo.让大家如何学好自如的用Context.想什么时候有Context,什么时候就有Context.

这里大致可以分为两种:一是传递Context参数,二是调用全局的Context.

其实我们应用启动的时候会启动Application这个类,这个类是在AndroidManifest.xml文件里其实是默认的

 <applicationandroid:icon="@drawable/ic_launcher"android:label="@string/app_name"><activityandroid:name=".ApplicationDemoActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>

这个Application类是单例的,也就是说我们可以自己写个Application(比如名为:MainApplication)类,来代替默认的Applicaiton,这个类可以保存应用的全局变量,我们可以定义一个全局的Context.供外部调用.用法如下:

package com.tutor.application;import android.app.Application;
import android.content.Context;public class MainApplication extends Application {/*** 全局的上下文.*/private static Context mContext;@Overridepublic void onCreate() {super.onCreate();mContext = getApplicationContext();} /**获取Context.* @return*/public static Context getContext(){return mContext;}@Overridepublic void onLowMemory() {super.onLowMemory();}}

我们需要在AndroidMainifest.xml把MainApplication注册进去(第10行代码):

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.tutor.application"android:versionCode="1"android:versionName="1.0" ><applicationandroid:icon="@drawable/ic_launcher"android:label="@string/app_name"android:name=".MainApplication" ><activityandroid:name=".ApplicationDemoActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

为了让大家更容易理解,写了一个简单的Demo.步骤如下:

第一步:新建一个Android工程ApplicationDemo,目录结构如下:

第二步:新建MainApplication.java,代码和上面一样我就不贴了.

第三步:新建一个工具类ToolsUtil.java,代码如下

package com.tutor.application;import android.content.Context;
import android.widget.Toast;/*** @author frankiewei.* 应用的一些工具类.*/
public class ToolUtils {/*** 参数带Context.* @param context* @param msg*/public static void showToast(Context context,String msg){Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();}/*** 调用全局的Context.* @param msg*/public static void showToast(String msg){Toast.makeText(MainApplication.getContext(), msg, Toast.LENGTH_SHORT).show();}
}

第四步:新建一个View命名为MainView.java就是我们Activity现实的View.代码如下:

package com.tutor.application;import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;/*** @author frankiewei.* 自定义的MainView.*/
public class MainView extends FrameLayout implements View.OnClickListener{private Context mContext;private Activity mActivity;/*** 参数Button.*/private Button mArgButton;/*** 全局Button.*/private Button mGlobleButton;/*** 退出Button.*/private Button mExitButton;public MainView(Context context){super(context);setupViews();}public MainView(Context context, AttributeSet attrs) {super(context, attrs);setupViews();}private void setupViews(){//获取View的上下文.mContext = getContext();//这里将Context转换为Activity.mActivity = (Activity)mContext;LayoutInflater inflater = LayoutInflater.from(mContext);View v = inflater.inflate(R.layout.main, null);addView(v);mArgButton = (Button)v.findViewById(R.id.arg_button);mGlobleButton = (Button)v.findViewById(R.id.glo_button);mExitButton = (Button)v.findViewById(R.id.exit_button);mArgButton.setOnClickListener(this);mGlobleButton.setOnClickListener(this);mExitButton.setOnClickListener(this);}public void onClick(View v) {if(v == mArgButton){ToolUtils.showToast(mContext, "我是通过传递Context参数显示的!");}else if(v == mGlobleButton){ToolUtils.showToast("我是通过全局Context显示的!");}else{mActivity.finish();}}}

这里MainView.java使用的布局main.xml代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="Welcome to frankie wei's blog." /><Buttonandroid:id="@+id/arg_button"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="传递Context参数"/><Buttonandroid:id="@+id/glo_button"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="全局的Context"/><Buttonandroid:id="@+id/exit_button"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="退出App"/></LinearLayout>

第五步:修改ApplicationDemoActivity.java,代码如下:

package com.tutor.application;import android.app.Activity;
import android.os.Bundle;public class ApplicationDemoActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);MainView mMainView = new MainView(this);setContentView(mMainView);}}

第六步:运行上述工程效果如下:

 

运行效果1                                                            运行效果2---- 点击第一个按钮

运行效果3---- 点击第二个按钮

好了今天就讲到这里,大家对Context有什么疑问的,可以留言!!!

源代码点击进入==>

谈谈Android里的Context的使用!!!相关推荐

  1. 老生常谈之Android里的dp和sp

    Android里面的sp和dp网上有很多文章都谈过了,但是看后总有一种意犹未尽的感觉.现在我也来谈谈dp和sp,和大家交流一下,不对之处欢迎拍砖. 一.dp(或者dip device independ ...

  2. android.mk 比较字变量,粉丝投稿 | 谈谈Android.mk

    原标题:粉丝投稿 | 谈谈Android.mk 本文由公号[你看上去真美](微信号:tmac_lover)粉丝投稿,目前工作是Android系统rom定制开发,有同行可以关注一下. 1. 为什么是An ...

  3. android 代码设置dialog 全屏,Android里把Dialog设置为全屏的方法

    Android里把Dialog设置为全屏的方法 有的时候我们需要把Dialog设置为全屏,于是我们想到了如下的办法: //设置成全屏 LinearLayout.LayoutParams p = new ...

  4. Android开发-在Android里接入阿里云推流SDK实现直播推流的功能

    前 言 如今,在国内移动互联网发展了几年的时间,移动开发技术也相对的成熟,在咱们日常使用的手机App中也少不了直播的功能,不管是娱乐类.游戏类.体育类还是教育类等的App都会有直播的功能,可以说直播的 ...

  5. 谈谈Android App混合开发

    推酷 文章 站点 主题 公开课 活动 客户端 荐 周刊 登录 谈谈Android App混合开发 时间 2015-08-25 20:13:43bxbxbai 原文  http://bxbxbai.gi ...

  6. servlet里面的context,定义属性值的事情!

    servlet里面的context,定义属性值. 在尚未指定属性值的时候.不管谁调用,都是NULL. 但是,一旦指定了属性值.那么,再次调用就是之间指定的数值啦! 而且,是象mapping一样存储对象 ...

  7. ASP.NET一般处理程序新建一个方法里使用context.Response.Write的解决方法

    ASP.NET一般处理程序新建一个方法里使用context.Response.Write的解决方法 参考文章: (1)ASP.NET一般处理程序新建一个方法里使用context.Response.Wr ...

  8. 谈谈JS里的{ }大括号和[ ]中括号的用法

    为什么80%的码农都做不了架构师?>>>    谈谈JS里的{ }大括号和[ ]中括号的用法,理解后就可以看懂JSON结构了. 一.{ } 大括号,表示定义一个对象,大部分情况下要有 ...

  9. 如何在ashx里提取context.Request.Files?

    我想实现一个功能,就是上传一个文件时,需要无刷新,我想利用脚本和ashx来实现,现在问题是,我在ashx里提取context.Request.Files总是为空,

最新文章

  1. python中的module
  2. 原生js实现preAll和nextAll方法
  3. UI设计十戒--设计师的艺术
  4. 好用的Eclipse 插件
  5. CnetOS中开关网络服务
  6. Redis服务器的启动过程分析
  7. linux下汇编语言开发总结
  8. Java包装类与基本数据类型的自动 手动装箱与自动 手动拆箱
  9. java timezone_Java TimeZone setID()方法与示例
  10. Android Activity与Fragment之间的传值概述
  11. micropython和python区别-什么是 MicroPython ?它有什么优势?
  12. Markdown效率参考手册
  13. Linux系统编程 -- 信号及signal函数
  14. NetApp S550:做“小”的艺术
  15. Bar Chart Race」动态可视化
  16. jquery option selected 无效
  17. 数据库开启遇到的keng
  18. 全面概述将人工智能市场纳入其广泛的数据库
  19. 低功耗蓝牙学习笔记-属性协议
  20. H5+微信公众号扫二维码页面跳转功能 vue实现

热门文章

  1. html 导航切换内容
  2. SQL Server2019配置管理器无法连接到 WMI 提供程序
  3. 更改MySQL数据库root密码
  4. Python 计算任意两向量之间的夹角
  5. word 以嵌入式插入图片显示不全,被文字掩盖在下方
  6. 基于Yocto构建嵌入式Linux系统U-boot、kernel内核、rootfs文件系统
  7. 3、TextBox 控件
  8. 软件工程 - 个人主页 - 可行性分析与需求分析文档
  9. 各项异性扩散(Anisotropic diffusion)--算法简介(python)代码实现
  10. Android学习之 Fragment