Android 全局获取 Context 与使用 Intent 传递对象
2016-04-03 17:43
459 查看
=====================全局获取 Context========================
Android 开发中很多地方需要用到 Context,比如弹出 Toast、启动活动、发送广播、操作数据库……
由于很多操作都是在活动中进行的,而活动本身就是一个 Context 对象,所以获取 Context 并不是那么困难。
但是,当应用程序的架构逐渐开始复杂起来的时候,很多的逻辑代码都将脱离 Activity 类,由此在某些情况下,获取 Context 并非那么容易。
Android 提供了一个 Application 类,每当应用程序启动的时候,系统就会自动将这个类进行初始化。而我们可以定制一个自己的 Application 类,以便管理程序内一些全局的状态信息,比如说全局 Context。
这里我们重写了父类的 onCreate( )方法,并通过调用 getApplicationContext( )方法得到了一个应用程序级别的 Context,然后又提供了一个静态的 getContext( )方法,在这里将刚才获取到的 Context 进行返回。
接下来需要告知系统,当程序启动的时候应该初始化 MyApplication 类,在 AndroidManifest 文件的<application>标签下进行指定就可以了。
这样就已经实现了一种全局获取 Context 的机制,之后不管你想在项目的任何地方使用 Context,只需要调用一下 MyApplication.getContext( )就可以了。
=====================使用Intent传递对象=======================
使用 Intent 来传递对象通常有两种实现方式,Serializable 和 Parcelable。
Serializable方式:
Serializable 是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可存储到本地。至于序列化的方法也很简单,只需要让一个类去实现 Serizable 这个接口就可以了。
这里让 Festival 类实现了 Serializable 接口,这样所有的 Festival 对象就都是可以序列化的了。
这里我们创建了一个 Festival 的实例,然后就直接将它传入到 putExtra( )方法中,通过 startActivity( )传递这个对象。
这里调用了 getSerializableExtra( )方法来获取传递过来的序列化对象,接着再将它向下转型成 Festival 对象,这样就成功实现了使用 Intent 传递对象的功能了。
Parcelable方式:
Parcelable 方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是 Intent 所支持的数据类型,这样也就实现传递对象的功能了。
首先让 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 对象,只不过获取对象时调用的是 getParcelableExtra() 方法,其他地方完全相同。
在传递对象时,Serializable 和 Parcelable 方法都是可行的,对比一下,Serializable 的方式较为简单,但由于会把整个对象进行序列化,因此效率方面会比 Parcelable方式低一些,根据情况需要合理运用这两种方式。
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遇到的问题)使用被weight分配空间后的控件高度值画新控件出现的问题
- [android] 常见对话框
- Android——实现欢迎界面的自动跳转(转)
- Android 贝塞尔曲线实现QQ拖拽清除效果
- Android SQLiteOpenHelper
- Android设计模式应用--策略模式
- Android设计模式之单例模式
- Android任务和返回栈完全解析,细数那些你所不知道的细节
- Android设计模式应用--工厂模式
- android onSaveInstanceState方法 横坚屏切换
- Android Camera 使用小结
- Android SDK manager 设置
- 【Android】如何实现一个简单的文件浏览器
- Android之Service
- Android设计模式应用---原型模式
- Android自定义滑动接听电话控件组
- Android学习第五篇——动画效果
- Android中Activity的管理
- LayoutInflater的正确用法
- 阅读《Android 从入门到精通》(35)——后台服务