谈谈Android里的Context的使用实例

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

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

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

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    >
    <activity
      android:name="ApplicationDemoActivity"
      android:label="@string/app_name" >
      <intent-filter>
        <action android:name="androidintentactionMAIN" />
        <category android:name="androidintentcategoryLAUNCHER" />
      </intent-filter>
    </activity>
  </application> 

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

package com.tutor.application; 

import androidappApplication;
import androidcontentContext; 

public class MainApplication extends Application { 

  /**
   * 全局的上下文
   */
  private static Context mContext; 

  @Override
  public void onCreate() {
    superonCreate(); 

    mContext = getApplicationContext(); 

  }   

  /**获取Context
   * @return
   */
  public static Context getContext(){
    return mContext;
  } 

  @Override
  public void onLowMemory() {
    superonLowMemory();
  } 

}

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

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemasandroidcom/apk/res/android"
  package="comtutorapplication"
  android:versionCode="1"
  android:versionName="0" > 

  <application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:name="MainApplication" >
    <activity
      android:name="ApplicationDemoActivity"
      android:label="@string/app_name" >
      <intent-filter>
        <action android:name="androidintentactionMAIN" />
        <category android:name="androidintentcategoryLAUNCHER" />
      </intent-filter>
    </activity>
  </application> 

</manifest>

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

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

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

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

package com.tutor.application;
import androidcontentContext;
import androidwidgetToast; 

/**
 * @author frankiewei
 * 应用的一些工具类
 */
public class ToolUtils { 

  /**
   * 参数带Context
   * @param context
   * @param msg
   */
  public static void showToast(Context context,String msg){
    ToastmakeText(context, msg, ToastLENGTH_SHORT)show();
  } 

  /**
   * 调用全局的Context
   * @param msg
   */
  public static void showToast(String msg){
    ToastmakeText(MainApplicationgetContext(), msg, ToastLENGTH_SHORT)show();
  }
}

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

package com.tutor.application; 

import androidappActivity;
import androidcontentContext;
import androidutilAttributeSet;
import androidviewLayoutInflater;
import androidviewView;
import androidwidgetButton;
import androidwidgetFrameLayout; 

/**
 * @author frankiewei
 * 自定义的MainView
 */
public class MainView extends FrameLayout implements ViewOnClickListener{ 

  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 = LayoutInflaterfrom(mContext);
    View v = inflaterinflate(Rlayoutmain, null);
    addView(v); 

    mArgButton = (Button)vfindViewById(Ridarg_button);
    mGlobleButton = (Button)vfindViewById(Ridglo_button);
    mExitButton = (Button)vfindViewById(Ridexit_button); 

    mArgButtonsetOnClickListener(this);
    mGlobleButtonsetOnClickListener(this);
    mExitButtonsetOnClickListener(this);
  } 

  public void onClick(View v) {
    if(v == mArgButton){
      ToolUtilsshowToast(mContext, "我是通过传递Context参数显示的!");
    }else if(v == mGlobleButton){
      ToolUtilsshowToast("我是通过全局Context显示的!");
    }else{
      mActivityfinish();
    }
  } 

}

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemasandroidcom/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical" > 

  <TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Welcome to frankie wei's blog"
    /> 

  <Button
    android:id="@+id/arg_button"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="传递Context参数"
    /> 

  <Button
    android:id="@+id/glo_button"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="全局的Context"
    /> 

  <Button
    android: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 androidappActivity;
import androidosBundle; 

public class ApplicationDemoActivity extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    superonCreate(savedInstanceState); 

    MainView mMainView = new MainView(this);
    setContentView(mMainView); 

  } 

} 

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

运行效果1                            

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2016-11-17

Android获取其他包的Context实例代码

Android中有Context的概念,想必大家都知道.Context可以做很多事情,打开activity.发送广播.打开本包下文件夹和数据库.获取classLoader.获取资源等等.如果我们得到了一个包的Context对象,那我们基本上可以做这个包自己能做的大部分事情.那我们能得到吗?很高兴的告诉你,能!Context有个createPackageContext方法,可以创建另外一个包的上下文,这个实例不同于它本身的Context实例,但是功能是一样的. 这个方法有两个参数:1.packag

避免 Android中Context引起的内存泄露

Context是我们在编写Android程序经常使用到的对象,意思为上下文对象. 常用的有Activity的Context还是有Application的Context.Activity用来展示活动界面,包含了很多的视图,而视图又含有图片,文字等资源.在Android中内存泄露很容易出现,而持有很多对象内存占用的Activity更加容易出现内存泄露,开发者需要特别注意这个问题. 本文讲介绍Android中Context,更具体的说是Activity内存泄露的情况,以及如何避免Activity内存泄

Android全局获取Context实例详解

Android全局获取Context实例详解 在弹出Toast 启动活动 发送广播 操作数据库 使用通知等等时都需要Context 如果操作在活动中进行是很简单的,因为活动本身就是一个Context对象 但是当逻辑代码脱离了Activity类,此时使用Context就需要一些技巧了: 我们可以定制一个自己的Application类,以便管理程序内一些全局状态信息,比如全局Context 代码如下: public class MyApplication extends Application{ p

Android编程实现为ListView创建上下文菜单(ContextMenu)的方法

本文实例讲述了Android编程实现为ListView创建上下文菜单(ContextMenu)的方法.分享给大家供大家参考,具体如下: ContextMenu称为上下文菜单,一般在控件上长按时弹出.今天我们学习ContextMenu的用法,这里与listview相结合,先在ListView显示几个Item,然后在Item上长按,弹出一个菜单(就是ContextMenu),点击菜单上的项目,提示刚才长按的Item的Position. main.xml文件 <?xml version="1.0

Android 中Context的使用方法详解

Android 中Context的使用方法详解 概要: Context字面意思是上下文,位于framework package的android.content.Context中,其实该类为LONG型,类似Win32中的Handle句柄.很多方法需要通过 Context才能识别调用者的实例:比如说Toast的第一个参数就是Context,一般在Activity中我们直接用this代替,代表调用者的实例为Activity,而到了一个button的onClick(View view)等方法时,我们用t

深入解析Android App开发中Context的用法

Context在开发Android应用的过程中扮演着非常重要的角色,比如启动一个Activity需要使用context.startActivity方法,将一个xml文件转换为一个View对象也需要使用Context对象,可以这么说,离开了这个类,Android开发寸步难行,对于这样一个类,我们又对他了解多少呢.我就说说我的感受吧,在刚开始学习Android开发时,感觉使用Context的地方一直就是传入一个Activity对象,久而久之感觉只要是Context的地方就传入一个Activity就行

android基础教程之context使用详解

在android中有两种context,一种是application context,一种是activity context,通常我们在各种类和方法间传递的是activity context. 区别联系: 复制代码 代码如下: public class MyActivity extends Activity {    public void method() {       mContext = this;    // since Activity extends Context       m

Docker基础教程之Dockerfile语法详解

前言 Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令.Docker程序将这些Dockerfile指令翻译真正的Linux命令.Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile.Docker程序将读取Dockerfile,根据指令生成定制的image.相比image这种黑盒子,Dockerfile这种显而易见的脚本更容易被使用者接受,它明确的表明ima

基于Android studio3.6的JNI教程之opencv实例详解

基本环境: Android studio3.6 NDK:r14b(尽量使用该版本) Opencv3.4.1 android sdk (1)新建工程OpenCVDemo,选择,一定要选择Native c++类型,最后要选c++14支持. (2)File->Project Structure->SDK Location,设置这3个路径,NDK选择r14b. (3)任意找一张图片,复制到res/drawable. (4)修改布局文件res/layout/ activity_main.xml <

基于Android studio3.6的JNI教程之helloworld思路详解

jdk环境变量配置: path中增加下面2个路径,也就是android studio的路径,android有自带的jdk. E:\Android\Android Studio\jre\bin E:\Android\Android Studio\bin 新建工程: 一定要选择Native c++类型,最后要选c++11支持. SDK设置: File->Settings File->Project Structure 首先确定工程的目录结构,然后尝试运行一下工程,使用模拟器,确保工程没问题, 在M

Zend Framework教程之Autoloading用法详解

本文实例讲述了Zend Framework教程之Autoloading用法.分享给大家供大家参考,具体如下: 一.概述 自动加载是一种机制,无需依赖手动编写PHP代码.参考»PHP手册自动加载,一旦自动加载器被定义,你试图使用一个没有定义的类或接口的情况下,它会自动被调用. 使用自动加载,在项目中你不必担心类的存放位置.定义一个良好定义的自动加载器,您不需要考虑一个类文件相对于当前类文件的位置,您只需使用类,自动加载器将自动查找文件. 此外,自动加载,确保只加载一次,提升了性能 -所以可以用它替

Android基础知识之broadcast广播详解

Android中的广播用的太多了,今天稍微总结一下. 按注册方式分为两种: 1.静态注册广播: 静态注册广播就是在androidManifest.xml文件中注册广播,假设我们要实现这样一个效果,在一个activity上点击按钮,发送一条广播,这条广播弹出一个toast,显示"静态"二字. 先看看广播接受者: public class MyBroadcast extends BroadcastReceiver { @Override public void onReceive(Cont

android基础教程之android的listview与edittext冲突解决方法

最近遇到一个关于android软键盘的问题.在ListView中每个Item中都有个EditText,在最后的几个Item中,EditText第一次点击界面还能向上弹出,正常显示, 但第二次点击时,软件盘就把最后的几个Item给正当住了.这样很影响用户体验的. 其实解决的办法只要想一下,我相信有经验的开发人员就能够想到,让软键盘在消失的时候让相应Item中的EditText消失焦点clearFouce():但是有个关键的问题, 就是在获得返回事件的时候,如果获得的事件不对那就不会达到想要的效果.

Android基础之startActivityForResult()的用法详解

前言 安卓开发中一个很基础的操作就是打开一个 Activity ,另一个很必要的操作就是,打开一个 Activity ,在打开的 Activity 中操作之后并获得返回结果. 两个 Activity 为了演示这个操作,我们需要两个 Activity : MainActivity 和 OtherActivity ,在 MainActivity 中通过 Intent 启动 OtherActivity ,并获得 OtherActivity 结束后返回的结果,例子仅作演示,为了方便,我直接在 Java

AngularJS教程之MVC体系结构详解

模型 - 视图 - 控制器或MVC,MVC是普遍的叫法,是一种软件设计模式,用于开发Web应用程序.模型- 视图 - 控制器模式是由以下三部分组成: 模型/Model - 一个负责维护数据模式的最低水平. 视图/View - 负责显示所有或数据到用户的部分. 控制器/Controller - 软件代码控制Model和View之间的相互作用. MVC是受欢迎的,因为它隔离了应用逻辑从用户界面层和支持的关注点分离.这里的控制器接收用于该应用程序的所有请求,制备视图所需要的任何数据.视图,使用制备的控

AngularJS入门教程之ng-checked 指令详解

AngularJS ng-checked 指令 AngularJS 实例 选择一个或选择所有选项: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script> </head>