• 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( )就可以了。

    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方式低一些,根据情况需要合理运用这两种方式。

  • 相关阅读:
    redis 数据类型 Hash
    redis有序集合类型sort set
    redis数据类型set
    redis的 list
    redis的key
    centos安装redis
    input聚焦事件
    width(),innerWidth(),outerWidth(),outerWidth(true)
    jq 选择器
    详解CSS中:nth-child的用法_大前端
  • 原文地址:https://www.cnblogs.com/woider/p/5350218.html
Copyright © 2020-2023  润新知