Android编程实现全局获取Context及使用Intent传递对象的方法详解
作者:woider 发布时间:2022-02-27 08:50:13
本文实例讲述了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程序设计有所帮助。


猜你喜欢
- MD5的全称是Message-Digest Algorithm 5,Message-Digest泛指字节串(Message)的Hash变换,
- 本文实例讲述了WinForm调用jar包的方法。分享给大家供大家参考,具体如下:因为工作需要,需要做一个数据上传的程序,客户规定的是:数据接
- 关于在Android中实现ListView的弹性效果,有很多不同的方法,网上一搜,也有很多,下面贴出在项目中经常用到的两种实现ListVie
- 介绍最近项目开发中用到了WebView播放视频的功能,总结了开发中犯过的错误,这些错误在开发是及容易遇到的,所以我这里总结了一下,希望大家看
- 目前很多网页都有滑动验证,目的就是防止不良爬虫扒他们网站的数据,我这次本着学习的目的使用Java和selenium学习解决滑动验证的问题,前
- 1、VS打开 工具-》NuGet包管理器-》管理解决方案的NuGet程序包如果打开界面一直搜索,加载不出东西,查看https://www.n
- 几乎所有运算符都只能操作“主类型”(Primitives)。例外是“=”、“= =”和“! =”,它们能操作所有对象。除此以外,String
- 本文实例讲述了Android编程实现播放视频的方法。分享给大家供大家参考,具体如下:播放视频文件其实并不比播放音频文件复杂,主要是使用 Vi
- 一、lateinit延迟初始化关键字Kotlin中很多语法特性,如变量不可变,变量不可为空,等等 这些特性都是为了尽可能地保证程序安全而设计
- spring data jpa @query返回map踩坑记录最近用spring data jpa,网上看的一些教程,有的说是返回的Obje
- 一、问题描述LBS位置服务是android应用中重要的功能,应用越来越广泛,下面我们逐步学习和实现lbs相关的应用如定位、地图、导航等,首先
- 本文实例为大家分享了Android实现表情功能的具体代码,供大家参考,具体内容如下Dialog实现表情评论功能核心问题:1、如何得到键盘弹起
- 什么是通用Mapper通用Mapper就是为了解决单表增删改查,基于Mybatis的插件。开发人员不需要编写SQL,不需要在DAO中增加方法
- 前言Kotlin一个强大之处就在于它的扩展函数,巧妙的运用这些扩展函数可以让你写出的代码更加优雅,阅读起来更加流畅,下面总结了在开发中经常用
- 本文实例讲述了Android简单Button事件响应综合提示控件Toast应用。分享给大家供大家参考,具体如下:前面讲述了在main.xml
- 本文实例讲述了java生成xml格式文件的方法。分享给大家供大家参考,具体如下:这里演示利用Java生成xml格式文件Demo中所用到的ja
- MyBatis 是一款优秀的持久层框架,被各大互联网公司使用,本文使用Spring Boot整合Mybatis,并完成CRUD操作。为什么要
- 文件的上传与下载(一)在实现文件上传和下载之前我们需要做一些准备工作,在Apache官网去下载文件上传下载的两个组件,下载链接这里给出:co
- 比较适合新手。逻辑上仍然有点问题。可以用于学习java文件操作下载地址:http://yun.baidu.com/share/link?sh
- using Word;下面的例子中包括C#对Word文档的创建、插入表格、设置样式等操作:(例子中代码有些涉及数据信息部分被省略,重要是介绍