Android编程实现全局获取Context及使用Intent传递对象的方法详解

发布时间 - 2026-01-11 02:42:45    点击率:

本文实例讲述了Android编程实现全局获取Context及使用Intent传递对象的方法。分享给大家供大家参考,具体如下:

一、全局获取 Context

Android 开发中很多地方需要用到 Context,比如弹出 Toast、启动活动、发送广播、操作数据库……

由于很多操作都是在活动中进行的,而活动本身就是一个 Context 对象,所以获取 Context 并不是那么困难。

但是,当应用程序的架构逐渐开始复杂起来的时候,很多的逻辑代码都将脱离 Activity 类,由此在某些情况下,获取 Context 并非那么容易。

Android 提供了一个 Application 类,每当应用程序启动的时候,系统就会自动将这个类进行初始化。而我们可以定制一个自己的 Application 类,以便管理程序内一些全局的状态信息,比如说全局 Context。

public class MyApplication extends Application {
  private static Context context;
  @Override
  public void onCreate() {
    super.onCreate();
    context =getApplicationContext();
  }
  public static Context getContext() {
    return context;
  }
}

这里我们重写了父类的 onCreate()方法,并通过调用 getApplicationContext()方法得到了一个应用程序级别的 Context,然后又提供了一个静态的 getContext()方法,在这里将刚才获取到的 Context 进行返回。

接下来需要告知系统,当程序启动的时候应该初始化 MyApplication 类,在 AndroidManifest 文件的<application>标签下进行指定就可以了。

<application android:name="MyApplication"> ... </application>

这样就已经实现了一种全局获取 Context 的机制,之后不管你想在项目的任何地方使用 Context,只需要调用一下 MyApplication.getContext()就可以了。
复制代码 代码如下:Toast.makeText(MyApplication.getContext(),"全局Context获取成功",Toast.LENGTH_SHORT).show();

二、使用Intent传递对象

使用 Intent 来传递对象通常有两种实现方式,Serializable 和 Parcelable。

Serializable方式:

Serializable 是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可存储到本地。至于序列化的方法也很简单,只需要让一个类去实现 Serizable 这个接口就可以了。

public class Festival implements Serializable {
  private String name;
  private String data;
  public Festival(String name,String data){
    this.name = name;
    this.data = data;
  }
  public String getName() {
    return name;
  }
  public String getData() {
    return data;
  }
}

这里让 Festival 类实现了 Serializable 接口,这样所有的 Festival 对象就都是可以序列化的了。

Festival festival = new Festival("元旦节","1月1日");
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("festival_object",festival);
startActivity(intent);

这里我们创建了一个 Festival 的实例,然后就直接将它传入到 putExtra()方法中,通过 startActivity()传递这个对象。
复制代码 代码如下:Festival festival = (Festival)getIntent().getSerializableExtra("festival_object");

这里调用了 getSerializableExtra()方法来获取传递过来的序列化对象,接着再将它向下转型成 Festival 对象,这样就成功实现了使用 Intent 传递对象的功能了。

Parcelable方式:

Parcelable 方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是 Intent 所支持的数据类型,这样也就实现传递对象的功能了。

public class Person implements Parcelable {
  private String name;
  private int age;
  //省略set和get方法
  protected Person(Parcel in) {
    name = in.readString();//读取name
    age = in.readInt();//读取age
  }
  public static final Creator<Person> CREATOR = new Creator<Person>() {
    @Override
    public Person createFromParcel(Parcel in) {
      return new Person(in);
    }
    @Override
    public Person[] newArray(int size) {
      return new Person[size];
    }
  };
  @Override
  public int describeContents() {
    return 0;
  }
  @Override
  public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(name);//写出name
    dest.writeInt(age);//写入age
  }
}

首先让 Person 类实现 Parcelable 接口,这样就必须重写 describeContents()writeToParcel()这两个方法。其中describeContents()方法直接返回 0 就可以了,而 writeToParcel()方法中需要调用 Parcel 的 writeXxx()方法将 Person 类中的字段一一写出。

除此之外,还必须在 Person 类中提供一个名为 CREATOR 的常量,这里创建了 Parcelable.Creator 接口的一个实现,并将泛型指定为 Person。

接着需要重写 createFromParcel()newArray()这两个方法,在 createFromParcel()方法中去读取刚才写出的 name 和 age 字段,并创建一个 Person 对象进行返回,其中 name和age都是调用 Parcel 的 readXxx()方法读取到的,注意这里的读取顺序一定要和写出顺序完全相同。而newArray()方法中只需要new出一个Person数组,并使用方法中传入的 size 作为数组大小就可以了。
复制代码 代码如下:Person person = (Person)getIntent().getParcelableExtra("person_object");

依然可以使用相同的代码来传递 Person 对象,只不过获取对象时调用的是 getParcelableExtra() 方法,其他地方完全相同。

在传递对象时,Serializable 和 Parcelable 方法都是可行的,对比一下,Serializable 的方式较为简单,但由于会把整个对象进行序列化,因此效率方面会比 Parcelable方式低一些,根据情况需要合理运用这两种方式。

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。


# Android  # 全局获取  # Context  # Intent  # 传递对象  # Android List(集合)中的对象以某一个字段排序案例  # Android使用FontMetrics对象计算位置坐标  # Android使用Canvas对象实现刮刮乐效果  # Android中将Bitmap对象以PNG格式保存在内部存储中的方法  # Android中利用C++处理Bitmap对象的实现方法  # Android中实现长按修改ListView对象的内容  # Android中传递对象的三种方法的实现  # Android中深入学习对象的四种引用类型  # 都是  # 就可以  # 序列化  # 应用程序  # 这两个  # 实现了  # 重写  # 只需要  # 完全相同  # 自己的  # 类中  # 的是  # 进阶  # 就会  # 是在  # 在这里  # 相关内容  # 也就  # 只需  # 你想 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何选择可靠的免备案建站服务器?  Laravel如何实现API速率限制?(Rate Limiting教程)  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  Android仿QQ列表左滑删除操作  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  如何登录建站主机?访问步骤全解析  详解jQuery停止动画——stop()方法的使用  Laravel怎么使用Intervention Image库处理图片上传和缩放  Laravel怎么上传文件_Laravel图片上传及存储配置  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  使用Dockerfile构建java web环境  C++时间戳转换成日期时间的步骤和示例代码  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  香港服务器租用每月最低只需15元?  Laravel模型事件有哪些_Laravel Model Event生命周期详解  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  Laravel storage目录权限问题_Laravel文件写入权限设置  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  如何在万网自助建站平台快速创建网站?  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  Python文件异常处理策略_健壮性说明【指导】  网站制作大概多少钱一个,做一个平台网站大概多少钱?  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  如何续费美橙建站之星域名及服务?  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  EditPlus中的正则表达式实战(6)  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  详解Huffman编码算法之Java实现  如何快速搭建虚拟主机网站?新手必看指南  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  如何快速上传建站程序避免常见错误?  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  如何用腾讯建站主机快速创建免费网站?  JavaScript如何实现倒计时_时间函数如何精确控制  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?