第十三章 应该掌握的高级技巧

一、全局获取Context的技巧

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

定制一个自己的Application其实并不复杂,首先我们需要创建一个MyApplication类继承自Application ,代码如下所示:

public class MyApplication extends Application {
      private static Context context;
      @Override
      public void onCreate() {
            context = getApplicationContext();
     //通过调用getApplicationContext()方法得到一个应用程序级别的Context
      }
      public static Context getContext() {
            return context;
     //将获取到的Context返回
      }
}

在AndroidManifest.xml文件的标签下进行指定就可以了,代码如下所示:

<application
    android:name="com.example.networktest.MyApplication"
    ...>
    ...
</application>

※这里在指定MyApplication的时候一定要加上完整的包名,不然系统将无法找到这个类。

       这样我们就已经实现了一种全局获取Context的机制,之后不管你想在项目的任何地方使用Context ,只需要调用一下MyApplication.getContext() 就可以了。

二、使用Intent传递对象

2.1Serializable方式

        Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。    

        至于序列化的方法也很简单,只需要让一个类去实现Serializable这个接口就可以了。比如说有一个Person 类,其中包含了name 和age 这两个字段,想要将它序列化就可以这样写:

public class Person implements Serializable{
     private String name;
     private int age;
     public void setName(String name){
          this.name=name;
     }
     public int getAge(){
          return age;
     }
     public void setAge(int age){
          this.age=age;
     }
}

       get 、set 方法都是用于读取和赋值字段数据的,最重要的部分是在第一行。这里让Person 类去实现了Serializable 接口,这样所有的Person对象就都是可序列化的了。

接下来在FirstActivity 中的写法非常简单:

Person person = new Person();
person.setName("Tom");
person.setAge(20);
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("person_data", person);//传递值
startActivity(intent);

接下来在SecondActivity 中获取这个对象也很简单,写法如下:

Person person = (Person) getIntent().getSerializableExtra("person_data");

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

2.2Parcelable方式

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

修改Person 中的代码,如下所示:

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

       ①首先我们让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作为数组大小就可以了。

在SecondActivity 中获取对象的时候需要稍加改动,如下所示:

Person person = (Person) getIntent().getParcelableExtra("person_data");

※Parcelable的方式比Serializable的方式效率高

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值