Android编程实现全局获取Context及使用Intent传递对象的方法详解
本文实例讲述了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()
就可以了。
二、使用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()传递这个对象。
这里调用了 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 对象,只不过获取对象时调用的是 getparcelableextra()
方法,其他地方完全相同。
在传递对象时,serializable 和 parcelable 方法都是可行的,对比一下,serializable 的方式较为简单,但由于会把整个对象进行序列化,因此效率方面会比 parcelable方式低一些,根据情况需要合理运用这两种方式。
更多关于android相关内容感兴趣的读者可查看本站专题:《android开发入门与进阶教程》、《android调试技巧与常见问题解决方法汇总》、《android基本组件用法总结》、《android视图view技巧总结》、《android布局layout技巧总结》及《android控件用法总结》
希望本文所述对大家android程序设计有所帮助。