谈谈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---- 点击第二个按钮

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

(0)

相关推荐

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

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

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

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

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

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

  • 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全局获取Context实例详解

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

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

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

  • 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

  • 谈谈Android里的Context的使用实例

    大家好,今天给大家分享一下Android里的Context的一些用法,以前经常有人在群里问我比如我在一个工具类里的某个方法,或者View里需要调用Context.但是工具类还有View里没有这个上下文怎么办?为了解决大家的疑问,为了解决大家的疑问,我今天写一个简单的Demo.让大家如何学好自如的用Context.想什么时候有Context,什么时候就有Context. 这里大致可以分为两种:一是传递Context参数,二是调用全局的Context. 其实我们应用启动的时候会启动Applicati

  • Android编程中context及全局变量实例详解

    本文实例讲述了Android编程中context及全局变量的用法.分享给大家供大家参考,具体如下: 今天在研究context的时候,对application和activity context有了一定的了解,下面是从网上复制过来的资料 Application context和Activity context的区别: 这是两种不同的context,也是最常见的两种.第一种中context的生命周期与Application的生命周期相关的,context随着Application的销毁而销毁,伴随ap

  • Android获取arrays.xml里的数组字段值实例详解

    Android获取arrays.xml里的数组字段值实例详解 比如在arrays.xml里: <!--leo added for KYLIN-496--> <string-array name="reboot_item"> <item>Reboot</item> <item>Recovery</item> <item>BootLoader</item> </string-array&g

  • Android 音乐播放器的开发实例详解

    本文将引导大家做一个音乐播放器,在做这个Android开发实例的过程中,能够帮助大家进一步熟悉和掌握学过的ListView和其他一些组件.为了有更好的学习效果,其中很多功能我们手动实现,例如音乐播放的快进快退等. 先欣赏下本实例完成后运行的界面效果: 首先我们建立项目,我使用的SDK是Android2.2的,然后在XML中进行布局. 上方是一个ListView用来显示我们的音乐列表,中间是一个SeekBar可以拖动当前音乐的播放进度,之所以用SeekBar而不用ProgressBar是因为我们需

  • Android基于HttpUrlConnection类的文件下载实例代码

    废话不多说了,直接给大家贴代码了,具体代码如所示: /** * get方法的文件下载 * <p> * 特别说明 android中的progressBar是google唯一的做了处理的可以在子线程中更新UI的控件 * * @param path */ private void httpDown(final String path) { new Thread() { @Override public void run() { URL url; HttpURLConnection connectio

  • Android条目拖拽删除功能实例代码

    项目中需求,要做条目条目拖拽删除效果,实际效果和QQ消息删除一样,侧滑有制定和删除. 效果图 第一步效果图 1.0自定义控件 SwipeLayout 继承FrameLayout重写里面三个构造方法,分别调用initView(). 2.0在布局中使用自定义控件 3.0在initView()方法中,创建拖拽辅辅助工具 ViewDragHelper() 该方法需要传入回调 MyCallBack() 4.0,创建MyCallBack()回调,继承ViewDragHelper.Callback 在回调中

  • Android自定义指示器时间轴效果实例代码详解

    指示器时间轴在外卖.购物类的APP里会经常用到,效果大概就像下面这样,看了网上很多文章,大都是自己绘制,太麻烦,其实通过ListView就可以实现. 在Activity关联的布局文件activity_main.xml中放置一个ListView,代码如下.由于这个列表只是用于展示信息,并不需要用户去点击,所以将其clickable属性置为false:为了消除ListView点击产生的波纹效果,我们设置其listSelector属性的值为透明:我们不需要列表项之间的分割线,所以设置其divider属

  • Android原生态实现分享转发功能实例

    目录 导读:  一.xml布局文件 二.创建一个实体类 AppInfo.java,用来保存应用信息 三.重写PopupWindow控件SharePopupWindow.java,自定义分享的弹窗 四.使用provider 五.写一个工具类  六.GridView的适配器 AppInfoAdapter.java 七.自定义分享窗口SharePopupWindow的调用  导读: 之前刚学安卓时,写过一篇"Android调用系统shareAPI实现分享转发功能"的文章,随着安卓版本的迭代更

  • Android 实现圆角图片的简单实例

    Android 实现圆角图片的简单实例 实现效果图: 本来想在网上找个圆角的例子看一看,不尽人意啊,基本都是官方的Demo的那张原理图,稍后会贴出.于是自己自定义了个View,实现图片的圆角以及圆形效果.效果图: Android 圆角图片的实现形式,包括用第三方.也有系统的.比如makeramen:roundedimageview,系统的cardview , glide .fresco . compile 'com.android.support:appcompat-v7:24.0.0' com

随机推荐