全局获取Context的技巧,使用intent来传递对象

举例获得Context

例如我们编写了一个HttpUtil类,然后封装了起来

public class HttpUtil{
    public static void sendHttpRequest(final String address,final HttpCallbackListener listener){
        new Thread(new Runnable()){
            @override
            public void run() {
                 HttpURLConnection connection = null;
                 try{
                     URL url = new URL(address);
                     connection = (HttpURLConnection)url.openConnection();
                     connection.setRequestMethod("GET");
                     connection.setConnectTimeout(8000);
                     connection.setReadTimeout(8000);
                     connection.setDoInput(true);
                     connection.setDoOutput(true);
                     InputStream in = connection.getInputStream();
                     BufferedReader reader = new BufferedReader(new InputStreamReader(in);
                     StringBuilder response =new StringBuilder();
                     String line=null;
                     while ((line = reader.readLine())!=null){
                         response.append(line);
                     }
                     if (listener!=null){
                         listener.onFinish(response.toString());
                     }
                 }catch (Exception e) {
                     if (listener!=null){
                         listener.onError(e);
                     }
                 }finally {
                     if(connection!=null){
                         connection.disconnection();
                     }
                 }
             }
         }).start();
     }
 }

当我们想在里面打印Toast时,却发现找不到context,这是我们可以定制自己的Application类,以便管理一些全局的状态信息,比如说全局Context.

    public class MyApplication extends Application{
        private static Context context;
        @override
        public void onCreate(){
            context=getApplicationContext();
        }
        public static Context getContext(){
            return context;
        }
    }

然后在配置文件下添加android:name 的参数

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

使用intent传递数据

我们已经知道intent可以传递一些附加数据例如:

Intent intentNext = new Intent(getApplicationContext(), MusicService.class);
            intentNext.putExtra("musicpath", songPath);
            intentNext.putExtra(PLAY_TYPE_FLAG, TYPE_PLAYER);
            startActivity(intent);

Serializable(序列化)方式

表示将一个对象转化成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。至于序列化的方法也是很简单,只需要一个类去实现Serializable这个接口就可以了。

    public class Person implentents Serializable{
        private String name;
        private int age;

        public String getName(){
            return name;
        }

        public void setName(String name){
            this.name=name;
        }

        public int getAge(){
            return age;
        }
        public void setAge(int age){
            this.age=age;
        }
    }

这里让Person类去实现了Serializable接口,这样所有的Person对象就都是可以序列化的了。

    Person person=new Person();
    person.setName("tom");
    person.setAge(10);
    Intent intent =new Intent(FirstActivity.this,SecondActivity.class);
    intent.putExtra("person_data",person);
    startActivity(intent);

在SecondActivity中获得对象的方法为

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

Parcelable方式

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

    public class Person implements Parcelable{
        private String name;
        private int age;

        public String getName(){
            return name;
        }

        public void setName(String name){
            this.name=name;
        }

        public int getAge(){
            return age;
        }
        public void setAge(int age){
            this.age=age;
        }
        @override
        public void writeToParcel(Parcel dest,int flags){
            dest.writeString(name);//写出name 
            dest.writeInt(age);//写出age
        }
        public static final Parcelable.Creator CREATOR = new Parcelable.Creator(){
            @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];
            }
        };
    }

接下来我们在FirstActivity中用同样的形式来传递数据
但是
在SecondActivity中获取对象有所不同,如下:

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

Serializable的方式较为简单,但由于会把整个对象进行序列化,因此效率方面会比Parcelable方式低一些,所以在通常情况下还是更加推荐使用Parcelable的方式来实现Intent传递对象的功能。

你可能感兴趣的:(日记,Android技术开发)