=====================全局获取 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 全局获取 Context 与使用 Intent 传递对象的更多相关文章

  1. android#全局获取Context的技巧

    参考<第一行代码>——郭霖 回想这么久以来我们所学的内容,你会发现有很多地方都需要用到Context,弹出Toast的时候需要.启动活动的时候需要.发送广播的时候需要.操作数据库的时候需要 ...

  2. Android 如何全局获取Context

    有时,在处理业务逻辑的时候,需要Context对象,但在某些情况下,并非容易获取,这时就需要一些巧妙的手段来管理Context. 在Android中,提供了一个类Application,当应用程序启动 ...

  3. Android开发之全局获取Context的技巧

    转自<第一行代码-Android>进阶篇 这本书对于入门来说确实很棒,很简单明了的介绍了Android开发中涉及到的方方面面,对我的帮助很大,同时记录一些该书中一些对我以后开发有用的东西, ...

  4. 【转】Android 之最新最全的Intent传递数据方法

    原文地址:https://www.jianshu.com/p/1169dba99261 intent传递数据 为什么要和intent单独拿出来讲,因为Intent传递数据也是非常重要的 一.简单的传递 ...

  5. 全局获取Context的技巧

    全局获取Context的技巧 在android开发中,非常多地方都要用到Context上下文这个类对象,比方:弹出 Toast 的时候须要.启动活动的时候须要.发送广播的时候须要.操作数据库的时候须要 ...

  6. Android开发——使用intent传递对象

    intent传递对象有两种方法: 方式一:Serializable 方式 方式二:Parcelable方式 在这里不多介绍了,这一篇就是快速上手使用教程,至于详细原理介绍的,请看这一篇http://w ...

  7. android#使用Intent传递对象

    参考自<第一行代码>——郭霖 Intent的用法相信你已经比较熟悉了,我们可以借助它来启动活动.发送广播.启动服务等.在进行上述操作的时候,我们还可以在Intent中添加一些附加数据,以达 ...

  8. 怎样使用Intent传递对象

    怎样使用Intent传递对象 我们能够使用Intent来启动Activity.开启服务Service,发送广播Broadcast,然后使用Intent传递主要的数据类型,如:布尔值,整型,字符串等 I ...

  9. Intent传递对象——Serializable和Parcelable差别

    前两篇文章讨论了Serializable和Parcelable实现Intent之间传递对象和对象数组的方式.两种方法实现上相似,效果一致,怎么选择用哪种方法实现呢? Intent在不同的组件中传递对象 ...

随机推荐

  1. SSH-Hibernate+Struts2+Spring的股票项目整合

    创建项目之前:我们需要导入我们需要的Hibernate和Struts2和Spring的相关架包.(博客自创,如有问题请留言博主,拒绝盗版,支持正版http://www.cnblogs.com/WuXu ...

  2. android第一行代码-9.内容提供器

    内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能, 内容提供器包括两部分:使用现有的内容提供器来读取和操作相应程序中的数据跟创建自己的内容提供器给我们程序的 ...

  3. javascript正则表达式:匹配所有html标签

    此正则表达式收集于网络,但那个网站连复制一下都需要注册会员,鄙视之,所以不提他了.而且,原作者也不可能是那个网站. html标签有<h1></h1>这种成对的,也有<br ...

  4. NDK开发之一

    2015.07.22 Wiki_Tree: --NDK开发: --NDK特征: --MK文件编写规则: NDK开发: Ndk-build编译时会生成的两个同名的so库,位于不同的目录/project ...

  5. Fluent Nhibernate之旅(五)--利用AutoMapping进行简单开发

    Fluent Nhibernate(以下简称FN)发展到如今,已经相当成熟了,在Nhibernate的书中也相应的推荐了使用FN来进行映射配置,之前写的FN之旅至今还有很多人会来私信我问题,说来惭愧, ...

  6. AD_TLC549采集模拟信号

    AD_TLC549采集模拟信号 实验原理 芯片介绍 TLC549是 TI公司生产的一种低价位.高性能的8位A/D转换器,它以8位开关电容逐次逼近的方法实现 A/D转换,其转换速度小于 17us,最大转 ...

  7. 【MVVM】模型认识理解,

     MVVM:模型-视图-视图模型(Model-View-ViewModel) 注意:它是双向绑定的 源:http://www.ruanyifeng.com/blog/2015/02/mvcmvp_mv ...

  8. python使用uuid库生成唯一id

    概述: UUID是128位的全局唯一标识符,通常由32字节的字符串表示. 它可以保证时间和空间的唯一性,也称为GUID,全称为: UUID -- Universally Unique IDentifi ...

  9. Thinking in java学习笔记之迭代器

    Map<String,String> map = new HashMap<String,String>(); List list = new ArrayList(); list ...

  10. AOJ DSL_2_C Range Search (kD Tree)

    Range Search (kD Tree) The range search problem consists of a set of attributed records S to determi ...